Еще два варианта :
awk
awk '{if ($0~"pattern") print $0; nextfile;}' mydir/*
или если ваша версия awk
не поддерживает nextfile
(, спасибо Stéphane Chazelas за предложение ) :
awk 'FNR==1{if ($0~"pattern") print $0;}' mydir/*
прочитает только первую строку перед переключением на следующий файл и распечатает ее только в том случае, если она соответствует "pattern"
.
Преимущество заключается в том, что можно точно -настроить как поле для поиска шаблона для (, используя, например,. $2
для поиска только по второму полю )и выходу (, например.$3
, чтобы напечатать третье поле, или FILENAME
, или даже смешать ).
Обратите внимание, что сFNR
(«номером текущей входной записи», т. е. версией с номером строки ), вы можете точно -настроить строку (с ), по которой вы хотите выполнить grep :FNR==3
для третьей строки, FNR<10
для 10 первых строк и т. д. (Я думаю, в этом случае, если вы имеете дело с очень большими файлами и ваша версия awk
поддерживает это, вы можете смешать FNR
с nextfile
для повышения производительности.)
head
, сохранение имен файлов head -n1 -v mydir/files*|grep -B1 pattern
Опция-v
из head
будет печатать имена файлов, а опция -B1
из grep
будет печатать предыдущую строку совпадающих строк, то есть имена файлов. Если вам нужны только имена файлов, вы можете передать их дальше grep
:
head -n1 -v mydir/*|grep -B1 pattern|grep ==>
Как заметил в комментариях дон _crissti, остерегайтесь имен файлов, соответствующих шаблону, хотя…