Escondendo o Grep Da Lista De Processos

Introdução

Sabe quando você precisa filtrar um determinado processo na saída do ps e a própria linha do grep aparece como resultado? A coisa é mais ou menos assim:

$ ps -ef | grep bash
daemonio  4331  4323  0 22:16 pts/1    00:00:00 /bin/bash
daemonio  4942  4331  0 22:46 pts/1    00:00:00 grep --color=auto bash

Veja que o comando digitado também apareceu na saída e isso muitas das vezes não é desejável. Veremos duas soluções para eliminar essa última linha.

Solução 1

Uma solução comum para eliminar o comando grep da lista de processos é:

$ ps -ef | grep bash | grep -v grep
daemonio  4331  4323  0 22:16 pts/1    00:00:00 /bin/bash

Ok, funciona, mas acrescentamos mais um processo para realizar uma tarefa relativamente simples. Será que existe um modo mais elegante para resolver esse problema?

Solução 2

Em [1], vemos uma solução elegante para esse problema. Ela funciona assim:

$ ps -ef | grep '[b]ash'
daemonio  4331  4323  0 22:16 pts/1    00:00:00 /bin/bash

Aqui necessitamos de uma ajudinha das expressões regulares. Basicamente, o que acontece aqui é que a expressão regular [b]ash casa com a string bash e qualquer linha que contenha essa string será retornada pelo grep. Porém, quando o grep for processar sua própria linha, ele encontrará a string [b]ash que, obviamente, não casa com a string de pesquisa bash. Desse modo filtramos somente as linhas desejadas.

Lembrando que o uso dos colchetes não está obrigatoriamente limitado ao primeiro caractere. Você pode usá-los também no segundo ou no terceiro caractere e até mesmo em todos:

$ ps -ef | grep '[b][a][s][h]'
daemonio  4331  4323  0 22:16 pts/1    00:00:00 /bin/bash

Mas isso já é abuso das regexes. Quanto mais simples melhor. :-)

Referências

[1] Keeping Grep Out of Your Grep Output by MIKE GOLVACH (Acessado em: Novembro/2012)
http://linuxshellaccount.blogspot.com.br/2007/10/keeping-grep-out-of-your-grep-output.html

Deixe um comentário