繁体   English   中英

与awk匹配的正则表达式

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM