[英]regular expression matching with awk
我在用awk弄乱了一点,对bash / awk还是很陌生,所以请多多包涵
当我这样做以查找所有以root身份运行的进程时
ps aux | awk '$0 ~ /.*root*./ {print $0, $11}'
它会按照我的期望打印出所有内容,但它还在底部打印出一行,其中包括MY用户名(不是root)和awk进程。 这是为什么? 我该怎么办?
注意:对于打印出所有具有root用户的进程的替代解决方案,我并不是很感兴趣。 我已经可以做到了。 我想了解这里发生了什么以及如何使用它。
避免awk进程被打印的方法是这样的:
ps aux | awk '/[r]oot/ {print $0,$11}'
这种破解是这样的:awk将搜索字符“ r”,“ o”,“ o”,“ t”的序列。 实际的awk进程不匹配,因为ps输出包含字符'[''r'']''o''o''t'的序列。
似乎有两个问题:一个是您有*。 而不是在“ root”之后的。*。 另一个是您要搜索整行,而不仅仅是搜索包含用户名的列。
$ 0代表整行。 $ 1代表第一列。
更接近您想要的东西
ps aux | awk '$1 ~ /.*root.*/ {print $0, $11}'
但是你也可以做
ps aux | awk '$1=="root" {print $0, $11}'
这是你想要的吗?
ps aux | awk '$0 ~ /^root/ {print $0, $11}'
您拥有“最后一行”的原因是您的正则表达式为。 根。 。 并且您的ps | awk行具有相同的字符串。 因此它被选中。
也许您可以使用grep -v“ awk”来过滤掉awk行。
为了完全匹配您编写的第一个字段
ps aux | awk '$1 == "root"' { print $0, $11 }'
您也可以要求ps
为您过滤
ps -Uroot | awk ' { print $5 } '
如果您只需要匹配root拥有的进程(即,以字符串root开头的记录):
ps aux | awk '/^root/ { print $0, $11 }'
注意/regex/
和$0 ~ /regex/
是等价的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.