2011-10-16 33 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'。