我用awk搞砸了一下,我仍然是bash / awk的新手,所以请耐心等待
当我这样做时,查找以root身份运行的所有进程
ps aux | awk '$0 ~ /.*root*./ {print $0, $11}'
它按照我的预期打印出所有内容,但它也打印出底部的一行,包括我的用户名(不是root用户)和进程awk。这是为什么?我该怎么办呢?
注意:我对打印出具有root权限的所有进程的替代解决方案并不感兴趣。我已经可以做到了。我想了解这里发生了什么,以及如何使用它。
答案 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/
是等效的。