Como faço para pesquisar por várias palavras-chave ao usar awk ou grep?

1

Eu tenho uma coleção de arquivos. Quero pesquisar todos eles com grep para encontrar todos e somente aqueles que contêm em qualquer lugar ambos as strings keyword1 e keyword2 .

Eu também gostaria de saber como fazer isso com o awk.

    
por telnet 09.10.2011 / 11:58

3 respostas

2

Para grep, o símbolo pipe separa strings em um regexp de combinação; em alguns sistemas, pode ser necessário usar o egrep para ativar essa funcionalidade:

[madhatta@anni ~]$ egrep 'exact|obsol' /etc/yum.conf
exactarch=1
obsoletes=1

Espero que a sintaxe seja semelhante para o awk.

Editar: yup:

[madhatta@anni ~]$ awk '/exact|obsol/ {print $1}' /etc/yum.conf
exactarch=1
obsoletes=1

Editar 2:

Você esclareceu sua solicitação, eis como fazer isso com o grep:

grep -l keyword1 * | xargs -d '\n' grep -l keyword2

Isto irá procurar todos os arquivos em um determinado diretório ( * ) para keyword1, passando a lista de arquivos correspondentes para o segundo grep, que irá procurar pela segunda string, via xargs. Eu tenho medo de não me incomodar em fazer isso com awk , pois está começando a parecer um problema de lição de casa. Se você tiver um caso comercial para usar o awk, avise-nos.

    
por 09.10.2011 / 12:10
1

Pesquisar em um arquivo

Usando o grep para encontrar linhas com "keyword1" ou "keyword2" no arquivo "myfile.conf":

grep -e "keyword1\|keyword2" myfile.conf

O escape do caractere | do pipe com uma barra invertida é pelo menos necessário em zsh.

Pesquisar em todos os arquivos em um diretório

Para pesquisar arquivos contendo "keyword1" ou "keyword2" em um diretório:

grep -r -e "keyword1\|keyword2" /path/to/my/directory

Se você deseja fazer uma pesquisa sem distinção entre maiúsculas e minúsculas, adicione também a opção -i .

    
por 09.10.2011 / 15:22
0

Se eu entendi corretamente, você deseja pesquisar todos os arquivos que contêm keyword1 e keyword2 em uma pasta específica, então, tente isto:

$ find /path/to/folder -type f -print0 | xargs -0 grep -li "keyword1" | \
                                    xargs -I '{}' grep -li "keyword2" '{}'
  • -print0 | xargs -0 cuida de nomes de arquivos com espaços em branco
  • -I informa xargs para substituir '{}' pela lista de argumentos
  • grep -li imprime o nome do arquivo em vez do padrão correspondente. Eu uso -i para maiúsculas e minúsculas.
por 09.10.2011 / 15:12

Tags