Короче говоря grep
делает одну вещь только как многие другие инструменты UNIX, и это соответствует строке к данному шаблону, и это делает это хорошо. С другой стороны, awk
более сложный инструмент, как это - полный язык программирования, определенный стандартом POSIX с типичными функциями как переменные, массивы, выражения, функции, или проверьте утверждения для сканирования шаблона и обработки.
По-моему, это зависит от реализации, как оба инструмента работают в случае сопоставления с образцом, и на размере некоторого входа Вы хотите обработать. Я ожидал бы, что grep обычно более эффективен, чем awk, поскольку он делает соответствие только. Но Вы не можете написать с grep простой код для выполнения более сложных задач как последующая обработка подобранных записей, вычисление или печатающие результаты, не используя другие инструменты.
grep '[[:lower:]]*xyz'
Вернет вам все строки, на которых совпадает этот шаблон. Но, конечно, это не соответствует явным последовательностям символов.
Тем не менее, похоже, что это проблема, которую вы уже решили:
grep -f - <<\STRINGS /dev/fd/3 3<<\DATA
^ZHDEOIMOSJDJKEJLCN
^HDEOIMOSJDJKEJLCN
^DEOIMOSJDJKEJLCN
^EOIMOSJDJKEJLCN
^OIMOSJDJKEJLCN
^IMOSJDJKEJLCN
^MOSJDJKEJLCN
^OSJDJKEJLCN
^SJDJKEJLCN
^JDJKEJLCN
^DJKEJLCN
^JKEJLCN
^KEJLCN
STRINGS
SJDJKEJLCN
JDJKEJLCN
o;aidsfjoasjif
KKEJnotLCN
DATA
SJDJKEJLCN
JDJKEJLCN
Если вы хотите программно сгенерировать ту же таблицу поиска ...
grep -f - <<STRINGS /dev/fd/3 3<<\DATA
$(
MATCH=ZHDEOIMOSJDJKEJLCN
until [ ${#MATCH} -lt ${MINLEN=6} ]
do printf '^%s\n' "$MATCH"
MATCH=${MATCH#?}
done
)
STRINGS
SJDJKEJLCN
JDJKEJLCN
o;aidsfjoasjif
KKEJnotLCN
DATA
SJDJKEJLCN
JDJKEJLCN