Use pipes para filtrar as linhas sucessivamente até obter o que deseja:
grep word1 /path | grep word2 | grep word3 | grep word4
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"?
Use pipes para filtrar as linhas sucessivamente até obter o que deseja:
grep word1 /path | grep word2 | grep word3 | grep word4
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
A ideia é usar o grep com a opção -P
(Perl-Compatibility) e lookahead regex (?=(regex))
:
grep -P '(?=.*?word1)(?=.*?word2)(?=.*?word4)(?=.*?word3)' /path
.*?
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 .*
)