Estou pesquisando um diretório recursivamente usando grep com os seguintes argumentos na esperança de retornar apenas a primeira correspondência. Infelizmente, ele retorna mais de um - na verdade, dois da última vez que olhei. Parece que tenho muitos argumentos, especialmente sem obter o resultado desejado. : - /
# grep -o -a -m 1 -h -r "Pulsanti Operietur" /path/to/directory
retorna:
Pulsanti Operietur
Pulsanti Operietur
Talvez grep não seja a melhor maneira de fazer isso? Você me diz, muito obrigado.
-r
obviamente), mas não devem doer (eu não usaria-a
)grep -m 1
retornou as duas instâncias por causa disso.|head -1
Resolvi-o!first not first from result
. Esta resposta imprime a primeira correspondência em qualquer arquivo e para. O que mais você esperava?Você pode canalizar o
grep
resultadohead
em conjunto com o stdbuf .Observe que, para garantir a parada após a enésima correspondência, você precisa usar
stdbuf
para garantirgrep
que a saída não seja armazenada em buffer:Assim que
head
consome 1 linha, ele é finalizado egrep
receberáSIGPIPE
porque ainda gera algo para canalizar enquantohead
estava fora.Isso assumiu que nenhum nome de arquivo contém nova linha.
fonte
xargs
:find . -name '*.gz' | xargs -I '{}' stdbuf -oL zgrep -al 'pattern' {} | head -n 1
. Isso, no entanto, não termina na primeira partida. Algum conselho?grep
's--line-buffered
opção Evitar tampão sobrecarga sem chamar um utilitário adicional?Meu programa grep-like
ack
tem uma-1
opção que para na primeira partida encontrada em qualquer lugar. Ele suporta o-m 1
que @mvp também se refere. Eu o coloquei lá porque, se estou pesquisando uma grande árvore de código-fonte para encontrar algo que sei que existe em apenas um arquivo, é desnecessário encontrá-lo e preciso pressionar Ctrl-C.fonte
ag
pode ser rápido, mas não tem a-1
opção que é útil neste casoVocê pode usar o comando abaixo se desejar imprimir uma linha inteira e o nome do arquivo se a ocorrência de uma palavra específica no diretório atual estiver sendo pesquisada.
fonte
Um único revestimento, usando
find
:fonte
grep -r
funciona muito mais rápido - é a única cópia que faz travessias de diretório.