grepping foo e bar [duplicado]

6

Estou procurando por opções de comando para grep encontre arquivos com as ocorrências de foo e bar .

Grepping com

grep -r -e foo -e bar .

mostra arquivos que têm apenas foo ou apenas bar e arquivos com foo e bar .

É possível com grep encontrar apenas arquivos com foo e bar (e exibir as linhas correspondentes a foo ou bar ou a ambos nesses arquivos somente )?

Exemplo:

echo foo > file1
echo bar > file2
(echo foo;echo;echo bar) >file3
echo barfoo > file4

o grep cmd:

grepcmd -r -e foo -e bar .
./file3:foo
./file3:bar
./file4:barfoo
    
por Gilles 07.02.2014 / 16:41

1 resposta

10

para encontrar arquivos que contenham ambos:

(assumindo o GNU grep / xargs )

grep -rl --null abc . | xargs -r0 grep -l bcd

E se você quiser ver as linhas que contêm abc ou bcd ou ambos nos arquivos que contêm abc e bcd :

grep -rl --null abc . |
  xargs -r0 grep -l --null bcd |
  xargs -r0 grep -He abc -e bcd

para corresponder a linhas que contenham ambos:

grep -re 'foo.*bar' -e 'bar.*foo' .

Isso funciona desde que os padrões não se sobreponham.

grep -re 'abc.*bcd' -e 'bcd.*abc' .

Não conseguirá encontrar as linhas que contêm abcd .

Se o seu grep tiver -P para o PCRE:

grep -rP '^(?=.*abc).*bcd' .

funcionaria.

Ou POSIXly:

find . ! -type d -exec awk '/abc/ && /bcd/ {print FILENAME ":" $0}' {} +

Você também pode usar agrep :

agrep -r 'abc;bcd' .
    
por 07.02.2014 / 16:59

Tags