我不是正则表达专家,但我认为我理解了基础知识。我正在阅读使用此语法提到的tutorial:
$ 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
那么为什么它会在第二个例子中找到第三个结果呢?
谢谢!
答案 0 :(得分:6)
正则表达式[a]bc
和abc
完全匹配相同的字符串集,但是它们被应用于不同的数据,因为grep
的命令行参数出现在ps
命令的输出。
使用[a]bc
会导致文字字符串"[a]bc"
出现在ps的输出中 - 这与正则表达式[a]bc
不匹配。
我们的想法是避免匹配grep
命令本身的行。
答案 1 :(得分:1)
当您将ps
导入grep
时,您经常会找到正在运行的grep
进程,因为该术语存在于程序名称中,并且很可能会匹配。
答案 2 :(得分:1)
括号是character class,但是如果一个字符具有一个字符且没有指定重复,则没有任何意义。
您获得不同结果的原因是因为ssh
与进程列表中的grep参数匹配,但[s]sh
与自身不匹配。