Procura por arquivos com mais de um termo (grep, awk?)

5

Estou usando um comando como este para encontrar arquivos com a palavra 'termo' neles:

grep -l term *

Mas agora eu quero ser capaz de encontrar arquivos que tenham duas palavras diferentes neles (vamos chamá-los termA e termB) - não necessariamente na mesma linha. Eu quero encontrar arquivos com ambos termos, não apenas arquivos que tenham qualquer termo.

Agora eu poderia escrever um script bash pesado para isso, mas grep, egrep, awk, sed ou qualquer outra coisa tem uma ferramenta que possa me ajudar?

Obrigado antecipadamente.

    
por Peter Howe 11.07.2012 / 14:18

3 respostas

4

Se os seus arquivos não contiverem bytes nulos

Nesse caso, você pode usar grep sozinho:

grep -Plz "termA.*termB|termB.*termA" *

Como funciona:

  • As Expressões regulares compatíveis com Perl termA.*termB e termB.*termA pesquisam cadeias que tenham ambos os termos em isso.

  • A porcentagem combinada de PCRE termA.*termB|termB.*termA corresponde a todas as sequências contendo os dois termos.

  • Por fim, a opção -z faz com que as linhas de dados terminem em bytes nulos em vez de novas linhas.

A propósito, não há necessidade de usar -P . Se você preferir continuar usando expressões regulares básicas POSIX , a sintaxe será semelhante:

grep -lz "termA.*termB\|termB.*termA" *

Se seus arquivos contiverem bytes nulos

Nesse caso, você precisará de ferramentas auxiliares:

(grep -l termA * ; grep -l termB *) | sort | uniq -d

Como funciona:

  • grep -l termA * ; grep -l termB * exibe todos os arquivos que contêm um dos termos. Os arquivos que contêm os dois termos serão exibidos duas vezes.

  • sort classifica a saída.

  • uniq -d exibe apenas linhas duplicadas (as linhas necessárias devem ser classificadas).

por 11.07.2012 / 15:16
3

Você pode usar as opções -e ou -f para pesquisar várias expressões (de man grep ):

    -e PATTERN, --regexp=PATTERN
          Use  PATTERN  as  the  pattern.   This  can  be  used to specify
          multiple search patterns, or to protect a pattern beginning with
          a hyphen (-).  (-e is specified by POSIX.)

   -f FILE, --file=FILE
          Obtain  patterns  from  FILE,  one  per  line.   The  empty file
          contains zero patterns, and therefore matches nothing.   (-f  is
          specified by POSIX.)

Então você usaria isso como:

$ grep -e termA -e termB *
    
por 11.07.2012 / 14:45
1

O grep suporta expressões regulares até onde eu sei. Eu uso a seguinte sintaxe para pesquisar vários termos:

    grep 'termA\|termB' /i/am/a/path

você precisa usar o caractere de escape '\' antes de cada '|' mas com isso eu bvelieve você pode usar quantas seqüências de pesquisa quiser

    
por 11.07.2012 / 14:53

Tags