Mais duas alternativas:
com awk
awk '{if ($0~"pattern") print $0; nextfile;}' mydir/*
ou se a sua versão awk
não suporta nextfile
(graças à sugestão de Stéphane Chazelas):
awk 'FNR==1{if ($0~"pattern") print $0;}' mydir/*
irá ler apenas a primeira linha antes de mudar para o próximo arquivo, e imprimi-lo apenas se corresponder a "pattern"
.
As vantagens são que é possível ajustar o campo no qual pesquisar o padrão (usando, por exemplo, $2
para pesquisar apenas no segundo campo) e a saída (por exemplo, $3
para imprimir o terceiro campo ou FILENAME
, ou até mixar.
Observe que com a versão FNR
(número do registro de entrada atual, ou seja, o número da linha) você pode ajustar mais a (s) linha (s) na qual deseja grep: FNR==3
para a terceira linha, FNR<10
para as 10 primeiras linhas, etc. (Eu acho que, neste caso, se você está lidando com arquivos muito grandes e sua versão awk
suporta, você pode querer misturar FNR
com nextfile
para melhorar o desempenho).
Com head
, mantendo nomes de arquivo
head -n1 -v mydir/files*|grep -B1 pattern
A opção
-v
de head
imprimirá nomes de arquivos, e a opção -B1
de grep
imprimirá a linha anterior de linhas correspondentes - ou seja, os nomes dos arquivos. Se você precisa apenas dos nomes dos arquivos, você pode canalizá-lo ainda mais para grep
:
head -n1 -v mydir/*|grep -B1 pattern|grep ==>
Como notado por don_crissti nos comentários, tenha cuidado com os nomes de arquivos que correspondem ao padrão, embora…