Bash:Grep正则表达式无法正常工作


0

当这样使用时grep

ps aux | grep 'processname' | awk '{print $2}'

PIDs与流程processname返回。使用时:

ps aux | grep '^processname' | awk '{print $2}'

我正在尝试获取命令行开始的进程processname,但它不起作用。

运行示例流程:

processname
other_processname

我想获得PID第一个选项,因为这processname是命令的开始。

我也试过使用过-E, -e, -w标志,它们都返回相同的结果。什么不对?

Answers:


4

^ 标记线的开始,而不是字段。

ps aux | grep ' processname'

会更接近,但它仍然可能会产生一些误报。

由于其他列的宽度是固定的,您也可以使用

grep '^.\{65\}processname'

在这里,^.\{65\}从行首开始就是65个字符。确切的数字可能因系统而异。

由于你已经在使用awk,这可能是一个更好的选择:

ps aux | awk '{ if ($11 == "processname") print $2 }'

您还可以重新格式化ps的输出以使grepping更容易:

ps ax -o pid,args | grep '^[^ ]\+ processname'

该开关-o pid,args使ps仅显示PID和带参数的命令。表达式^[^ ]\+匹配从行的开头到第一个空格的所有字符。


awk意义上的字段,例如,$2表示第二个字段。
丹尼斯

cmd显示裸命令,例如,仅显示processname没有参数。
丹尼斯

1
你是对的。我用了cmdcomm。后者显示裸命令。cmd并且args是别名。
丹尼斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.