为什么在正则表达式中将单个字符括在括号中时,在greting ps时会将grep本身排除在外?

时间:2013-06-14 13:05:24

标签: regex grep

如果我在Linux机器上执行以下grep:

$ ps -ef | grep bash
root      2286     1  0 Jun06 ?        00:03:15 /bin/bash /etc/init.d/zxy100wd
wmiller   6436  6429  0 Jun06 pts/0    00:00:01 bash
wmiller  10707  6429  0 Jun07 pts/1    00:00:00 bash
wmiller  10795  6429  0 Jun07 pts/2    00:00:00 bash
wmiller  16220  6436  0 06:55 pts/0    00:00:00 grep --color=auto bash

注意最后一行是报告grep本身,因为“bash”这个词位于gregs的args中。

但是,如果我把[]放在“bash”中的任何字母周围,我得到:

$ ps -ef | grep ba[s]h
root      2286     1  0 Jun06 ?        00:03:15 /bin/bash /etc/init.d/zxy100wd
wmiller   6436  6429  0 Jun06 pts/0    00:00:01 bash
wmiller  10707  6429  0 Jun07 pts/1    00:00:00 bash
wmiller  10795  6429  0 Jun07 pts/2    00:00:00 bash

这次没有关于grep的信息!

那么,为什么在搜索词中附上一个字母,即正则表达式,在括号中让grep在这里报告?我虽然[s]的意思是“[]封闭集中的任何字符,由字符”s“组成。

2 个答案:

答案 0 :(得分:6)

这是因为表达式ba[s]h(或[b]ash或...)只匹配bash,而不是ba[s]h(或[b]ash,或。 ..)。

因此grep命令正在查找bash的所有行:

root      2286     1  0 Jun06 ?        00:03:15 /bin/bash /etc/init.d/zxy100wd
wmiller   6436  6429  0 Jun06 pts/0    00:00:01 bash
wmiller  10707  6429  0 Jun07 pts/1    00:00:00 bash
wmiller  10795  6429  0 Jun07 pts/2    00:00:00 bash

wmiller  16220  6436  0 06:55 pts/0    00:00:00 grep --color=auto ba[s]h

不匹配,因为它不完全是bash

答案 1 :(得分:1)

Fedorqui用字符类技巧的解释指出它。我只是想指出我经常使用的另一种方法,虽然比你已经知道的使用-v命令的grep选项要长一些。

ps -ef | grep bash | grep -v grep