1

我不是正则表达式专家,但我认为我了解了基础知识。我正在阅读使用此语法提到的教程:

$ ps -ewwo pid,args | grep [s]sh

确定 SSHD 是否正在运行。

我不明白为什么第一个 s 在括号中。我会这样想ssh并且[s]sh会产生相同的结果,但实际上我会得到不同的结果。

$ ps -ewwo pid,args | grep [s]sh
 1258 /usr/bin/ssh-agent /usr/bin/dbus-launch --exit-with-session gnome-session --session=ubuntu
 2988 /usr/sbin/sshd -D

$ ps -ewwo pid,args | grep ssh
 1258 /usr/bin/ssh-agent /usr/bin/dbus-launch --exit-with-session gnome-session --session=ubuntu
 2988 /usr/sbin/sshd -D
 3082 grep --color=auto ssh

那么为什么它会在第二个例子中找到第三个结果呢?

谢谢!

4

3 回答 3

6

正则表达式[a]bcabc匹配完全相同的字符串集,但它们被应用于不同的数据,因为命令行参数grep出现在ps命令的输出中。

Using[a]bc导致文字字符串"[a]bc"出现在 ps 的输出中——这与正则表达式不匹配[a]bc

这个想法是避免匹配grep命令本身的行。

于 2012-07-04T06:01:12.300 回答
1

当您ps输入grep时,您通常会找到正在运行的grep进程,因为该术语存在于程序名称中并且很可能会匹配。

于 2012-07-04T05:57:28.130 回答
1

方括号是一个字符类,但拥有一个字符类且没有指定重复的字符类并没有什么意义。

你得到不同结果的原因是因为ssh它自己匹配进程列表中的 grep 参数,但它[s]sh不匹配自己。

于 2012-07-04T06:02:07.520 回答