2011-10-16 86 views
1

我瞎搞一點點使用awk匹配,我還是一種新的抨擊/ AWK如此忍受我正則表達式使用awk

,當我這樣做是爲了尋找所有進程作爲root運行

ps aux | awk '$0 ~ /.*root*./ {print $0, $11}' 

它打印出所有我想要的東西,但它也在底部打印出一行,其中包含MY用戶名(不是root)和過程awk。這是爲什麼?我能做些什麼呢?

注:我沒有替代解決方案很感興趣打印出所有具有根的過程。我已經可以做到這一點。我想了解這裏發生了什麼,以及我如何使用它。

回答

1

似乎有幾個問題:一個是你有*。而不是。*在「根」之後。另一個是你正在搜索整個行,而不僅僅是包含用戶名的列。

$ 0表示整條線。 $ 1代表第一列。

更接近於你想會是

ps aux | awk '$1 ~ /.*root.*/ {print $0, $11}' 

什麼,但你也可以只是做

ps aux | awk '$1=="root" {print $0, $11}' 
+0

很有意思。我現在知道了。爲什麼要搜索整條線?有沒有辦法只搜索一列? – Rell3oT

+0

添加更多細節 –

1

這是你想要的嗎?

ps aux | awk '$0 ~ /^root/ {print $0, $11}' 

你有「最後一行」的原因是你的正則表達式是。 根。。而你的ps | awk行有相同的字符串。所以它被選中。

也許你可以使用grep -v「AWK」來進行篩選的awk線。

+0

是的!究竟!這是否使它只搜索一列? – Rell3oT

+0

不,^根匹配行以「root」開頭。如果你想用某個值搜索某個列,用$ n = xxx或$ n〜/ exp /來使用awk。這裏是列索引。 – Kent

1

的第一個字段完全匹配你寫

ps aux | awk '$1 == "root"' { print $0, $11 }' 

,你也可以要求ps來過濾你

ps -Uroot | awk ' { print $5 } ' 
0

如果您需要匹配只能由擁有的過程(即記錄以字符串)開始:

ps aux | awk '/^root/ { print $0, $11 }' 

注意/regex/$0 ~ /regex/是等價的。

2

,以避免從被打印AWK過程的方法是這樣的:

ps aux | awk '/[r]oot/ {print $0,$11}' 

即劈像這樣工作:AWK將被搜索的字符「R」「O」「O」「T​​的序列」。實際的awk過程不匹配,因爲ps輸出包含字符序列'[''r'']''o''o''t'。