A pesquisa por arquivos contém linhas com muitas condições

1

Eu posso pesquisar arquivos que tenham uma palavra específica usando grep

grep -l "word" /path

No entanto, e se eu quiser procurar por arquivos que tenham "word 1" e "word 2" em uma mesma linha? Eu posso usar:

mkdir new;for i in * do;grep "word 1" $i > new/$i_new;done

use então

grep -l "word 2" /new

Mas eu gostaria de ter um comando de uma linha. Usando

egrep -w -R 'word 1|word 2' /path

apenas a pesquisa de linhas tem "palavra 1" OU "palavra 2".

E se eu tiver "palavra 3", "palavra 4"?

    
por Ooker 03.07.2014 / 19:18

2 respostas

1

Use pipes para filtrar as linhas sucessivamente até obter o que deseja:
grep word1 /path | grep word2 | grep word3 | grep word4

    
por Jos 04.07.2014 / 08:57
2

O que acontece se você tiver N palavras em linhas? Então você tem que usar N comandos piped grep ?

grep word1 /path | grep word2 | grep word3 | grep word4 | grep word5 | ... | grep wordN

Aqui está a utilizar apenas uma grep e a linha correspondente, se contiver várias palavras:

grep -E 'word1.*word2.*word3.*word4.*' /path

O comando acima simula AND usando a opção -E do grep. Este comando funcionará se suas palavras na fila estiverem na mesma ordem e falhará se você tiver uma linha como a seguinte:

word4 and word3 and word2 and word1

Então, qual é a nova ideia de trabalhar / encontrar as correspondências em qualquer ordem?

A ideia é usar o grep com a opção -P (Perl-Compatibility) e lookahead regex (?=(regex)) :

grep -P '(?=.*?word1)(?=.*?word2)(?=.*?word4)(?=.*?word3)' /path
  • O .*? significa corresponder a todos os caracteres . que repetiram zero ou mais vezes * enquanto são opcionais. O ? torna tudo opcional antes dele (significa zero ou uma vez em que tudo corresponde a .* )
por αғsнιη 04.01.2015 / 14:43