Como os outros disseram, sua solução básica é:
grep -c string a*
Você disse que queria classificar os arquivos e listar informações extras.
Você não pode entender tudo isso com grep, mas ls faz parte disso se você não estiver preocupado com a eficiência e os arquivos não tiverem espaços ou outros caracteres estranhos:
ls -tr `grep -l string a*` | while read file; do
grep -c string "$file" | tr '\n' '\t'
ls -l "$file"
done
O primeiro grep nos backticks procura por arquivos correspondentes, listando apenas os nomes. O primeiro ls os classifica por tempo de modificação ao contrário. Em seguida, pesquisamos cada arquivo uma segunda vez para contar ocorrências e acrescentamos a contagem à listagem "ls -l" padrão.
Isso será lento; se você realmente precisa de uma versão mais rápida, provavelmente pode hackear uma em uma linguagem de script.
grep -cnão fornece o número de ocorrências ... Fornece o número de linhas correspondentes. Então se você tem uma linha que diz "stringstring", que contará como 1, não 2.