在模式中使用awk命令参数时出错

时间:2016-02-17 16:02:29

标签: bash shell awk

我正在运行这些命令:

ps -ef | awk -v piddd="$child_pid" '$2 ~ /\<piddd\>/ { print $3; }'
ps -ef | awk -v piddd="$child_pid" '$2 ~ /piddd/ { print $3; }'

它没有给我任何结果。当我尝试这个时,我得到了我需要的东西,虽然在某些情况下我会得到额外的pid:

ps -ef | awk -v piddd="$child_pid" '$2 ~ piddd { print $3; }'

第一个出了什么问题?

3 个答案:

答案 0 :(得分:2)

您不能使用/pattern/语法的变量。

如果你想添加单词边界(并且你的awk版本支持语法),你可以通过连接字符串来实现:

ps -ef | awk -v piddd="$child_pid" '$2 ~ "\\<" piddd "\\>" { print $3 }'

请注意,在这种情况下必须转义\

如果你只想让整个字段与确切变量匹配,我建议使用简单的字符串比较:

ps -ef | awk -v piddd="$child_pid" '$2 == piddd { print $3 }'

答案 1 :(得分:1)

不需要解析ps实用程序的输出,只是为了获得子PPID的父pid PIDps实用程序已提供此功能。

ps -o ppid= -p $child_pid

参数-o ppid=告诉ps只打印父pid。如果没有=,则打印输出将包含标题PPID

参数-p $child_pid告诉ps从变量$child_pid标识的流程ID中获取流程信息。

答案 2 :(得分:0)

ps -ef | awk '$2 ~ /'`echo "$child_pid"`'/ { print $3; }'

# or

ps -ef | awk '$2 ~ /'$child_pid'/ { print $3; }'

# or create function
function father_pid() { ps -ef | awk '$2 ~ /'$1'/ { print $3; }'; }

# use function
father_pid $child_pid