2012-07-04 66 views
1

我不是正則表達式專家,但我認爲我理解了基本知識。我正在讀一tutorial使用這個語法中提到:正則表達式:[a] bc vs abc

$ 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 

那麼爲什麼它會在第二個例子中找到第三個結果呢?

謝謝!

+1

在你的第一個grep中,你把'ss [h]' - 與你的評論的其餘部分不匹配。 – Zac

+0

@Zac謝謝,那是一個錯字。對不起,修好了。 – The111

+0

這會更適合[unix站點](http://unix.stackexchange.com/?as=1)嗎? –

回答

6

正則表達式[a]bcabc匹配完全相同的一組字符串,但他們被應用到不同的數據,因爲該命令行參數grep出現在ps命令的輸出。

使用[a]bc會導致文字字符串"[a]bc"出現在ps的輸出中 - 並且這與正則表達式[a]bc不匹配。

這個想法是爲了避免匹配grep命令本身的行。

+3

你輸入的速度比我快。 :-) – Zac

1

當您將ps轉換爲grep時,您經常會發現正在運行的grep進程,因爲該術語存在於程序名稱中,並且很可能匹配。

1

括號是character class但它沒有任何意義,只有一個字符的字符類沒有重複指定。

您得到不同結果的原因是因爲ssh自己將進程列表中的grep參數匹配,但它本身並不匹配。