Eu não acho que o grep seja capaz do que você quer fazer.
Apenas use o awk em vez disso :-)
Esta solução pode não funcionar bem para arquivos grandes (não está otimizada). E funciona apenas para palavras simples - não regexps. Mas é fácil adicionar alguns recursos, se assim desejar.
Versão low end com restrições descritas nos comentários abaixo:
awk '
{
split($0, b); for (i in b) ++A[b[i]]
}
END {
split("'"$*"'", a)
for (i in a) print sprintf("%s %d", a[i], A[a[i]])
}
'
apenas forneça as strings de pesquisa diretamente ao script
[EDITAR]
versão fixa com suporte a regex (veja o comentário abaixo).
Por favor, diga-me se ainda há problemas em aberto.
# ---- my favorite ----
awk -F' ?-c ' '
BEGIN { split("'"$*"'", a) }
{ for (i = 2; a[i]; ++i) if (match($0, a[i])) ++A[i] }
END { for (i = 2; a[i]; ++i) if (A[i]) print a[i] " " A[i] }
'
# ---- my favorite ----
uso de amostra:
script_name -c alfa -c beta -c gamma << !
alfa
beta
gamma
gamma
!
dá:
alfa 1
beta 1
gamma 2
uso de regex:
script_name -c "^al" -c "beta" -c gamma -c "m.$" << !
alfa
beta
gamma
gamma
!
dá:
^al 1
beta 1
gamma 2
m.$ 2
[/ EDIT]