e se eu quiser excluir N linhas após a linha com "palavra indesejada" também? -v 'unwanted_word' --after Nnão ajuda porque INCLUI a linha e N linhas depois.
Andrey Regentov 6/11/2014
-vou --invert-matchselecione linhas não correspondentes. No seu caso grep -v 'unwanted_word' fileou grep --invert-match 'unwanted_word' file.
Adamski.pro 29/11
Quero ignorar uma linha acima e uma linha abaixo com o padrão correspondente. Como posso alcançá-lo?
Kanji Viroja
Impressionante, eu uso isso no git para ler rapidamente o status do meu repo, funciona como um encanto: #git status -s |grep -v "folder_I_dont_care"
benjaminz
3
Estranho, é a resposta principal, mas em alguns casos está errado! Se eu quiser encontrar sun, exceto quando for sunrise, grep sun|grep -v sunrisepula a linha que contém os dois sune sunriseao mesmo tempo, não é isso que eu quero. grep -P 'sun(?!rise)'é muito melhor.
greene 24/03
86
Entendi a pergunta como "Como faço para corresponder uma palavra, mas excluir outra", para a qual uma solução são dois greps em série: primeiro grep encontrando a "palavra1" desejada, segundo grep excluindo "palavra2":
grep "word1"| grep -v "word2"
No meu caso: preciso diferenciar entre "plot" e "#plot", que a opção "word" do grep não funciona ("#" não é alfanumérico).
Obrigado por isso, muito útil! Eu gostaria de mencionar que o comando grep é diferencia maiúsculas de minúsculas por padrão
DocWiki
2
Observe que grep -v -Ptambém funciona sem negação na expressão regular.
cybersoft
"se bash ... você precisará escapar do !" . Obrigado, obrigado, obrigado! Era isso que eu queria!
Gabriel Staples
36
A solução certa é usar grep -v "word" file, com seu awkequivalente:
awk '!/word/' file
No entanto, se você tiver uma situação mais complexa na qual deseja, por exemplo, XXXaparecer e YYYnão aparecer, será awkútil em vez de canalizar vários greps:
awk '/XXX/ && !/YYY/' file
# ^^^^^ ^^^^^^# I want it |# I don't want it
Você pode até dizer algo mais complexo. Por exemplo: eu quero aquelas linhas que contêm XXXou YYY, mas não ZZZ:
Aqui, o grep tentará listar todas as ocorrências de 'wanted_pattern' em todos os arquivos do diretório atual e passará para o segundo grep para filtrar o 'indesejado_pattern'. '|' - o pipe dirá ao shell para conectar a saída padrão do programa esquerdo (grep -r 'wanted_pattern' *) à entrada padrão do programa direito (grep -v 'unwanted_pattern').
Eu tenho um diretório com um monte de arquivos. Quero encontrar todos os arquivos que NÃO contêm a string "speedup", então usei com êxito o seguinte comando:
Na página do manual: "-L, --files-match-Suprime a saída normal; em vez disso, imprima o nome de cada arquivo de entrada do qual nenhuma saída seria impressa normalmente. A digitalização será interrompida na primeira correspondência. " (Ênfase por mim) Então cuidado com isso!
grep -Rv "word_to_be_ignored" . | grep "word_to_be_searched"
Respostas:
Você pode fazer isso usando
-v
a--invert-match
opção (for ) do grep como:grep -v "unwanted_word" file
filtrará as linhas que possuemunwanted_word
egrep XXXXXXXX
listará apenas as linhas com padrãoXXXXXXXX
.EDITAR:
No seu comentário, parece que você deseja listar todas as linhas sem o
unwanted_word
. Nesse caso, tudo que você precisa é:fonte
-v 'unwanted_word' --after N
não ajuda porque INCLUI a linha e N linhas depois.-v
ou--invert-match
selecione linhas não correspondentes. No seu casogrep -v 'unwanted_word' file
ougrep --invert-match 'unwanted_word' file
.git status -s |grep -v "folder_I_dont_care"
sun
, exceto quando forsunrise
,grep sun|grep -v sunrise
pula a linha que contém os doissun
esunrise
ao mesmo tempo, não é isso que eu quero.grep -P 'sun(?!rise)'
é muito melhor.Entendi a pergunta como "Como faço para corresponder uma palavra, mas excluir outra", para a qual uma solução são dois greps em série: primeiro grep encontrando a "palavra1" desejada, segundo grep excluindo "palavra2":
No meu caso: preciso diferenciar entre "plot" e "#plot", que a opção "word" do grep não funciona ("#" não é alfanumérico).
Espero que isto ajude.
fonte
word1
.Se você
grep
suporta expressões regulares Perl com a-P
opção que você pode fazer (se bash; se tcsh, você precisará escapar do!
):Demo:
Vamos agora listar todos,
foo
excetofoo3
fonte
grep -v -P
também funciona sem negação na expressão regular.!
" . Obrigado, obrigado, obrigado! Era isso que eu queria!A solução certa é usar
grep -v "word" file
, com seuawk
equivalente:No entanto, se você tiver uma situação mais complexa na qual deseja, por exemplo,
XXX
aparecer eYYY
não aparecer, seráawk
útil em vez de canalizar váriosgrep
s:Você pode até dizer algo mais complexo. Por exemplo: eu quero aquelas linhas que contêm
XXX
ouYYY
, mas nãoZZZ
:etc.
fonte
grep -P
solução em arquivos grandes.grep -P
significa usar o Perl regexp, portanto, carregar esse pacote será muito mais caro do que o normalgrep
.Inverter correspondência usando grep -v:
fonte
O grep fornece a opção '-v' ou '--invert-match' para selecionar linhas não correspondentes.
por exemplo
Isso exibirá todas as linhas do arquivo file_name, que não possui 'indesejados_padrão'.
Se você estiver pesquisando o padrão em vários arquivos dentro de uma pasta, poderá usar a opção de pesquisa recursiva da seguinte maneira
Aqui, o grep tentará listar todas as ocorrências de 'wanted_pattern' em todos os arquivos do diretório atual e passará para o segundo grep para filtrar o 'indesejado_pattern'. '|' - o pipe dirá ao shell para conectar a saída padrão do programa esquerdo (grep -r 'wanted_pattern' *) à entrada padrão do programa direito (grep -v 'unwanted_pattern').
fonte
A
-v
opção mostrará todas as linhas que não correspondem ao padrão.fonte
Eu tenho um diretório com um monte de arquivos. Quero encontrar todos os arquivos que NÃO contêm a string "speedup", então usei com êxito o seguinte comando:
fonte