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