Я не думаю, что grep способен на то, что вы хотите сделать.
Просто используйте вместо этого awk :-)
Это решение может не работать для больших файлов (не оптимизировано). И работает только для простых слов, а не для регулярных выражений. Но при желании легко добавить некоторые функции.
Младшая версия с ограничениями, изложенными в комментариях ниже:
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]])
}
'
просто передайте строки поиска непосредственно в скрипт
[РЕДАКТИРОВАТЬ]
исправлена версия с поддержкой регулярных выражений (см. комментарий ниже).
Пожалуйста, скажите мне, если еще есть какие-либо открытые вопросы.
# ---- 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 ----
пример использования:
script_name -c alfa -c beta -c gamma << !
alfa
beta
gamma
gamma
!
дает:
alfa 1
beta 1
gamma 2
использование регулярных выражений:
script_name -c "^al" -c "beta" -c gamma -c "m.$" << !
alfa
beta
gamma
gamma
!
дает:
^al 1
beta 1
gamma 2
m.$ 2
[/РЕДАКТИРОВАТЬ]