grep中的[t] ricky方括号表达式如何工作?


38

我最近看到了这种单线:

$ ps -ef | grep [f]irefox 

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

因此,似乎返回了数据中带有“ firefox”的进程列表,但忽略了grep进程本身,因此,它大致等同于:

ps -ef |grep -v grep| grep firefox

我不明白它是如何工作的。我看过grep和其他地方的手册页,但没有找到解释。

而且,如果我跑步,那么这个奥秘就更加复杂了:

$ 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 ....

[t] rick似乎停止工作了!

我敢肯定,这里有人会知道发生了什么事。

谢谢。


嗯,您确定这是正确的吗?ps -eaf | grep [fF] irefox会更有意义。这看起来像一个正则表达式,并且意味着匹配任何一个包含的字符。也可以在范围内完成,例如[0-9]
mbs 2012年

嗯,是。那就是我遇到的问题:仅包含一个字符的字符类似乎毫无意义,却产生了“神秘的”副作用!无论如何,jokerdino提供了很好的解释。
Thorsen 2012年

Answers:


57

方括号表达式是bash shell(以及其他shell) grep字符类模式匹配的一部分。

grep程序默认情况下理解POSIX基本正则表达式。这样您就可以定义字符类。例如,如果存在ps -ef | grep [ab9]irefoxa irefox”,“ b irefox”,“ 9 irefox”,则找到它们,但找不到“ ab irefox”。

该命令grep [a-zA-Z0-9]irefox甚至可以找到所有以一个字母或数字开头并以“ irefox”结尾的进程。

因此ps -ef | grep firefox搜索其中的行firefox。由于grep进程本身中包含“ firefox”,因此grep也可以找到它。通过添加a [],我们仅搜索字符类“ [f]”(它仅由字母“ f”组成,因此等效于仅带括号的“ f”)。现在,方括号的优点在于,字符串“ firefox”不再出现在grep命令中。因此,grep本身不会出现在grep结果中。

因为不是很多人都熟悉方括号作为字符类匹配和正则表达式,所以第二个结果可能看起来有些神秘。

如果要修复第二个结果,可以按以下方式使用它们:

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

(参考)


1
嗯 在我看来,[]是grep甚至没有机会被shell解释的东西。感谢您的解释。所有[m]粒都解决了。
Thorsen 2012年

乐意效劳。祝你有美好的一天:)
jokerdino

1
在bash中,方括号被传递到grep如果没有匹配他们在字(即没有名为“火狐”在当前目录下的文件)。但是,grep也具有字符类,并且grep中的[f]与f相同。
Daniel Hershcovich 2012年

6
实际上,在这种情况下,我认为grep之前的shell不会解释它。我认为[f]是字符类的正则表达式模式匹配括号。就像“ [a-z0-9] irefox”一样,grep也会匹配“ airefox”和“ 0irefox”。您可以轻松地看到它不是内置的bash,因为echo $([f])返回了错误。
con-f-use

4
[f]irefox为此目的工作的特定原因是它不会被外壳扩展。当外壳膨胀[f]irefoxfirefox,导致grepfirefox,然后firefox是部分grep的命令字符串,就好像grep firefox已经运行。但是最好记住外壳模式匹配,尤其是在编写脚本时,因为如果firefox当前目录中有一个文件被调用则外壳确实会扩展[f]irefox到,firefox并且此方法失败,即,显示了grepfrom ps所在的行。
伊利亚·卡根

10

原因是字符串

grep firefox

匹配模式firefox,但是字符串

grep [f]irefox

与模式不匹配(与模式[f]irefox等效firefox)。

这就是为什么第一个grep匹配其自己的进程命令行,而第二个grep不匹配的原因。


这使我的头部更加受伤
Pithikos
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.