Estou tentando construir uma pesquisa grep que deve incluir o termo e excluir outro termo. Tento usar várias opções de "padrão" -E, mas não funcionou.
Aqui está um exemplo de um comando que tentei.
grep -Ei "\,17\:31" | grep -Eiv "10\.10\.210\.154" file.csv
mas os resultados de saída correspondem apenas à segunda restrição grep -Eiv "10.10.210.154"
Responder1
Supondo que você queira encontrar \,17\:31
, mas não do IP10\.10\.210\.154
Você pode usar isso.
grep -Ei "\,17\:31" file.csv | grep -Eiv "10\.10\.210\.154"
Responder2
Observação:a outra respostadeveria funcionar, mas não explica nada; daí minha resposta explicativa.
Você disse ao segundo grep
para ler file.csv
, então é o que acontece. Ele ignora sua entrada padrão porque é isso que grep
faz quando opera em arquivo(s).
Na verdade, o segundo grep
age como se o primeiro não estivesse lá. Ele sai após processar o arquivo e imprimir sua saída (se houver).
O primeiro grep
aguarda entrada (normalmente do teclado, se executado em um shell interativo). Ele pode levar muitas linhas e até imprimir muitas linhas (correspondentes) em sua saída padrão, até que o buffer do pipe decida passar a saída para o segundo arquivo grep
. Então, se o segundo grep
não existir mais, o primeiro grep
é avisado que o cano está rompido; ele sai.
Ou você pode pressionar Ctrl+ Dpara indicar o fim da entrada; ou você pode apertar Ctrl+ Cpara matar o primeiro grep
(e o segundo, se ainda estiver vivo). Mas isso não corrigirá seu fluxo de dados.
Um fluxo de dados adequado é assim: você precisa que o primeiro grep
leia o arquivo e depois canalize o resultado para o segundo:
grep -Ei "\,17\:31" file.csv | grep -Eiv "10\.10\.210\.154"
# or
<file.csv grep -Ei "\,17\:31" | grep -Eiv "10\.10\.210\.154"
A última sintaxe tem pelo menos uma vantagem, explicada no final doesta é outra resposta minha.