Como essa expressão de colchetes no grep funciona?

31

Eu vi este one-liner recentemente:

$ ps -ef | grep [f]irefox 

thorsen   16730     1  1 Jun19 ?        00:27:27 /usr/lib/firefox/firefox ...

Portanto, parece que a lista de processos com o "firefox" é retornada nos dados, mas deixa de fora o próprio processo do grep e, portanto, parece mais ou menos equivalente a:

ps -ef |grep -v grep| grep firefox

Eu não entendo como isso funciona. Eu olhei para a página man no grep e em outros lugares, mas não encontrei uma explicação.

E para agravar o mistério, se eu correr:

$ ps -ef | grep firefox  > data
$ grep [f]irefox data

thorsen   15820 28618  0 07:28 pts/1    00:00:00 grep --color=auto firefox
thorsen   16730     1  1 Jun19 ?        00:27:45 /usr/lib/firefox/firefox ....

o [t] rick parece parar de funcionar!

Alguém aqui saberá o que está acontecendo, tenho certeza.

Obrigado.

    
por Thorsen 20.06.2012 / 08:46

2 respostas

46

A expressão de colchetes é parte do bash shell (e outras shells também) da correspondência de padrões de classe de caractere do grep.

Por padrão, o programa grep compreende expressões regulares básicas POSIX. Com isso você pode definir classes de personagens. Por exemplo, ps -ef | grep [ab9]irefox encontraria " a irefox", " b irefox", " 9 irefixo" se existirem, mas não "< b> ab irefox ".

O comando grep [a-zA-Z0-9]irefox encontraria todos os processos que começam com exatamente uma letra ou número e terminam em "irefox".

Portanto, ps -ef | grep firefox procura por linhas com firefox . Como o próprio processo grep tem o "firefox", o grep também o encontra. Adicionando um [] , estamos apenas procurando pela classe de caractere "[f]" (que consiste apenas na letra "f" e é equivalente a apenas um "f" sem os colchetes). A vantagem dos colchetes agora é que a string "firefox" não aparece mais no comando grep. Portanto, o próprio grep não aparecerá no resultado do grep.

Como muitas pessoas não estão familiarizadas com colchetes como correspondência de classes de caracteres e expressões regulares em geral, o segundo resultado pode parecer um pouco misterioso.

Se você quiser corrigir o segundo resultado, poderá usá-lo desta maneira:

ps -ef | grep [f]irefox  > data
grep firefox data

(referência)

    
por jokerdino 20.06.2012 / 09:18
6

A razão é que a string

grep firefox

corresponde ao padrão firefox , mas a string

grep [f]irefox

não corresponde ao padrão [f]irefox (que é equivalente ao padrão firefox ).

É por isso que o primeiro grep corresponde à sua própria linha de comando do processo, enquanto o segundo não.

    
por Daniel Hershcovich 25.06.2012 / 20:06