正则表达式与awk匹配

时间:2011-10-16 21:05:04

标签: regex bash awk

我用awk搞砸了一下,我仍然是bash / awk的新手,所以请耐心等待

当我这样做时,查找以root身份运行的所有进程

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

它按照我的预期打印出所有内容,但它也打印出底部的一行,包括我的用户名(不是root用户)和进程awk。这是为什么?我该怎么办呢?

注意:我对打印出具有root权限的所有进程的替代解决方案并不感兴趣。我已经可以做到了。我想了解这里发生了什么,以及如何使用它。

5 个答案:

答案 0 :(得分:2)

避免打印awk进程的方法是:

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

那个hack的工作方式是这样的:awk会搜索字符序列'r''o''''t'。实际的awk进程不匹配,因为ps输出包含字符序列'[''r'']''o''''t'。

答案 1 :(得分:1)

似乎有几个问题:一个是你有*。而不是。*在“root”之后。另一个是您正在搜索整行,而不仅仅是包含用户名的列。

$ 0代表整条线。 $ 1代表第一列。

更接近你想要的东西

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

但你也可以这样做

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

答案 2 :(得分:1)

这就是你想要的吗?

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

你拥有“最后一行”的原因是你的正则表达式是。 root。。你的ps | awk行有相同的字符串。所以它被选中了。

也许你可以用grep -v“awk”来过滤你的awk线。

答案 3 :(得分:1)

与您编写的第一个字段完全匹配

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

您也可以要求ps为您过滤

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

答案 4 :(得分:0)

如果您只需要匹配 root 所拥有的进程(即以字符串 root 开头的记录):

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

请注意,/regex/$0 ~ /regex/是等效的。