Respostas:
Você pode fazer isso usando -v
a --invert-match
opção (for ) do grep como:
grep -v "unwanted_word" file | grep XXXXXXXX
grep -v "unwanted_word" file
filtrará as linhas que possuem unwanted_word
e grep XXXXXXXX
listará apenas as linhas com padrão XXXXXXXX
.
EDITAR:
No seu comentário, parece que você deseja listar todas as linhas sem o unwanted_word
. Nesse caso, tudo que você precisa é:
grep -v 'unwanted_word' file
-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 caso grep -v 'unwanted_word' file
ou grep --invert-match 'unwanted_word' file
.
git status -s |grep -v "folder_I_dont_care"
sun
, exceto quando for sunrise
, grep sun|grep -v sunrise
pula a linha que contém os dois sun
e sunrise
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":
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).
Espero que isto ajude.
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 !
):
grep -P '(?!.*unwanted_word)keyword' file
Demo:
$ cat file
foo1
foo2
foo3
foo4
bar
baz
Vamos agora listar todos, foo
excetofoo3
$ grep -P '(?!.*foo3)foo' file
foo1
foo2
foo4
$
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 seu awk
equivalente:
awk '!/word/' file
No entanto, se você tiver uma situação mais complexa na qual deseja, por exemplo, XXX
aparecer e YYY
não aparecer, será awk
útil em vez de canalizar vários grep
s:
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 XXX
ou YYY
, mas não ZZZ
:
awk '(/XXX/ || /YYY/) && !/ZZZ/' file
etc.
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 normal grep
.
O grep fornece a opção '-v' ou '--invert-match' para selecionar linhas não correspondentes.
por exemplo
grep -v 'unwanted_pattern' file_name
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
grep -r 'wanted_pattern' * | grep -v 'unwanted_pattern'
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:
grep -iL speedup *
grep -Rv "word_to_be_ignored" . | grep "word_to_be_searched"