Eu vi esse verso recentemente:
$ ps -ef | grep [f]irefox
thorsen 16730 1 1 Jun19 ? 00:27:27 /usr/lib/firefox/firefox ...
Portanto, parece retornar a lista de processos com "firefox" nos dados, mas deixando de fora o próprio processo grep e, portanto, parece aproximadamente equivalente a:
ps -ef |grep -v grep| grep firefox
Eu não consigo entender como isso funciona. Eu olhei a página de manual 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.
command-line
bash
grep
Thorsen
fonte
fonte
Respostas:
A expressão entre colchetes faz parte da correspondência do padrão
bash shell (e outros shells)da classe de caracteres do grep.O
grep
programa, por padrão, compreende expressões regulares básicas do POSIX. Com isso você pode definir classes de caracteres. Por exemplops -ef | grep [ab9]irefox
, localizaria " a irefox", " b irefox", " 9 irefox" se existissem, mas não " 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".Então,
ps -ef | grep firefox
procura por linhas comfirefox
ele. Como o próprio processo grep tem "firefox", o grep também o encontra. Ao adicionar a[]
, procuramos apenas a classe de caracteres "[f]" (que consiste apenas na letra "f" e, portanto, é 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 grep em si não aparecerá no resultado do grep.Como poucas pessoas estão familiarizadas com colchetes como correspondência de classe de caracteres e expressões regulares em geral, o segundo resultado pode parecer um pouco misterioso.
Se você deseja corrigir o segundo resultado, pode usá-los desta maneira:
(Referência)
fonte
[f]
é o suporte de correspondência de padrão de expressão regular para classes de caracteres. Como em "[a-z0-9] irefox", o grep também corresponderia a "airefox" e "0irefox". Você pode ver facilmente que não é um bash interno, poisecho $([f])
retorna um erro.[f]irefox
funciona para esse fim é que ele não é expandido pelo shell. Quando o shell se expande[f]irefox
parafirefox
, isso causagrep
a visualizaçãofirefox
efirefox
faz parte dagrep
sequência de comandos do comando, exatamente como segrep firefox
fosse executado. Mas é bom ter em mente a correspondência de padrões de shell , principalmente ao criar scripts, porque se houver um arquivo chamadofirefox
no diretório atual , em seguida, o shell não expandir[f]irefox
parafirefox
e este método falhar, ou seja, agrep
linha deps
é mostrado.O motivo é que a string
corresponde ao padrão
firefox
, mas a stringnão corresponde ao padrão
[f]irefox
(que é equivalente ao padrãofirefox
).É por isso que o primeiro grep corresponde à sua própria linha de comando do processo, enquanto o segundo não.
fonte