GREP: Como procurar por um valor, mas, ao mesmo tempo excluir algumas partidas
Pergunta
Eu preciso de uma maneira de simplificar este comando:
grep 'SEARCHTERM' server.log | grep -v 'PHHIABFFH' | grep -v 'Stats'
Deve encontrar todas as linhas, incluindo SEARCHTERM
mas excluem se uma das linhas SEARCHTERM
inclui PHHIABFFH
ou Stats
.
Solução
Este trabalho:
grep 'SEARCHTERM' server.log | grep -Ev 'PHHIABFFH|Stats'
Outras dicas
Por que você quer 'simplificar' esta tubulação? ferramentas Un * x linha de comando são feitas para ser preso de uma forma como esta.
Editar
Algumas das respostas sugerem a utilização de recursos das versões específicas de grep. I como este, mas é muito possível que tais características específicas não estão presentes na versão do grep usado pelo OP.
Então, enquanto nós não sabemos o que o ambiente do OP tem e qual a versão do que ferramenta que ele pode usar sugiro para manter o comum apresenta presente em todas versões das ferramentas usadas.
Este novo ilustra bem o Un * x filosofia.
É fácil subestimar o poder da combinação de tubos e redirecionamento. Como um exemplo elucidativo, O Unix Shell como um 4GL [Schaffer-Wolf] mostra que com essas instalações como um quadro, um punhado de utilitários simples podem ser combinados para apoiar a criação e manipulação de bases de dados relacionais expressos como mesas textuais simples.
http://www.catb.org/ ~ esr / escritos / taoup / html / ch07s02.html # encanamento
Se meios simples apenas um comando com mais args ...
awk '$0 !~ /PHHIABFFH|Stats/ && /SEARCHTERM/' server.log
você pode simplesmente usar o shell
while read -r line
do
case "$line" in
*"Stats"*|*"PHHIABFFH"*) continue;;
*"SEARCHTERM"* ) echo "$line";;
esac
done < "file"
Eu teria feito apenas isto:
grep 'SEARCHTERM' server.log | grep -v -e 'PHHIABFFH' -e 'Stats'