grep -v "grep"
recebe entrada linha por linha e gera apenas as linhas nas quais grep
não aparece. Sem -v
, seria de saída apenas as linhas em que grep
não aparecem. Veja man grep
para detalhes.
No que diz respeito ao grep
próprio utilitário, não é importante que o padrão grep
passado a ele como argumento seja o mesmo que seu nome. Mas na maioria dos casos em que grep -v grep
realmente aparece, isso não é coincidência.
grep -v grep
(ou grep -v 'grep'
ou grep -v "grep"
) geralmente aparece no lado direito de um tubo cujo lado esquerdo é um ps
comando. É provável que você tenha visto. Por exemplo, eu posso estar procurando programas em execução cujos nomes, caminhos ou argumentos da linha de comando sugiram que eles estejam relacionados ao Xfce:
ek@Io:~$ ps x | grep xfce
2955 ? Ssl 0:10 xfce4-power-manager
2958 ? S 0:00 /usr/lib/x86_64-linux-gnu/xfce4/xfconf/xfconfd
31901 pts/1 S+ 0:00 grep --color=auto xfce
Meu grep
comando foi mostrado na saída, mas não é o que estou procurando. Estou procurando informações sobre os processos que já estavam em execução quando examinei o que estava sendo executado, não o processo que está sendo executado apenas por causa do meu esforço para examinar o que está sendo executado.
Uma maneira comum de remover essa distração é adicionar outro canal a grep -v grep
:
ek@Io:~$ ps x | grep xfce | grep -v grep
2955 ? Ssl 0:10 xfce4-power-manager
2958 ? S 0:00 /usr/lib/x86_64-linux-gnu/xfce4/xfconf/xfconfd
grep
sem -F
trata seu padrão como uma expressão regular e não como uma sequência fixa . Portanto, outra abordagem é escrever uma expressão regular que corresponda exatamente, xfce
mas que seja escrita de maneira diferente. Por exemplo:
ek@Io:~$ ps x | grep '[x]fce'
2955 ? Ssl 0:10 xfce4-power-manager
2958 ? S 0:00 /usr/lib/x86_64-linux-gnu/xfce4/xfconf/xfconfd
Isso funciona porque [x]
é uma classe de caracteres que corresponde exatamente à letra x
.
Uma falha desses métodos populares é que eles filtram as linhas que contêm grep
mesmo quando não são o grep
comando que você acabou de executar. Eles podem até não ser grep
comandos - apenas comandos cujos nomes, caminhos ou argumentos da linha de comando contêm grep
. Portanto, como Sergiy Kolodyazhnyy apontou , muitas vezes nenhuma dessas maneiras (nem qualquer outra abordagem que envolva a produção de ps
) é realmente ideal e, como Nic Hartley mencionou , outras maneiras costumam ser usadas pgrep
. Por exemplo:
ek@Io:~$ pgrep -af xfce
2955 xfce4-power-manager
2958 /usr/lib/x86_64-linux-gnu/xfce4/xfconf/xfconfd
-a
mostra a linha de comando completa. Omita-o para mostrar apenas o número de identificação do processo.
-f
pesquisa na linha de comando completa. Omita-o para pesquisar apenas os nomes.
man grep
ler a página do manual de referência para o comando ou, para obter mais informações sobre determinados comandos (incluindo grep), você podeinfo grep
... seu sistema possui documentação que geralmente é muito útil.