como usar o grep para “incluir” e “excluir outro termo” do arquivo?

como usar o grep para “incluir” e “excluir outro termo” do arquivo?

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 greppara ler file.csv, então é o que acontece. Ele ignora sua entrada padrão porque é isso que grepfaz quando opera em arquivo(s).

Na verdade, o segundo grepage como se o primeiro não estivesse lá. Ele sai após processar o arquivo e imprimir sua saída (se houver).

O primeiro grepaguarda 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 grepnã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 grepleia 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.

informação relacionada