如何用awk/sed/grep提取指定匹配的PID并按规则命名
问题:提取特定进程PID并赋值变量
进程信息输出
执行以下命令获取Java进程的PID和标识信息:
root# ps -ef | grep [j]ava | awk '{print $2,$9}' 45134 -Dapex=APEC 45135 -Dapex=JAAA 45136 -Dapex=APEC
需求说明
需要按规则给三个变量赋值:
- 第一个出现
APEC的进程PID →First_PID - 第二个出现
APEC的进程PID →Second_PID(对应输出的第三行) - 标识为
JAAA的进程PID →Third_PID(对应输出的最后一行)
预期输出结果:
First_PID=45134 Second_PID=45136 Third_PID=45135
尝试的错误命令
之前尝试的命令未得到预期结果:
First_PID =ps -ef | grep [j]ava | awk '{print $2,$9}'|awk '{if ($0 == "[^0-9]" || $1 == "APEC:") {print $0; exit;}}'
解决方案
可以用单条awk命令一次性完成处理,无需多管道拼接,逻辑更清晰:
ps -ef | grep [j]ava | awk '{ # 分割标识字段,提取APEC/JAAA部分 split($9, tag_arr, "=") current_tag = tag_arr[2] # 处理APEC标识的进程,按出现次数记录PID if (current_tag == "APEC") { apec_counter++ if (apec_counter == 1) first_pid = $2 if (apec_counter == 2) second_pid = $2 } # 处理JAAA标识的进程 if (current_tag == "JAAA") third_pid = $2 } END { # 输出最终赋值结果 print "First_PID=" first_pid print "Second_PID=" second_pid print "Third_PID=" third_pid }'
逻辑说明
- 用
split()函数将-Dapex=XXX分割成数组,提取出后面的标识内容; - 统计
APEC出现的次数,分别记录第一次和第二次出现的PID; - 遇到
JAAA标识时直接记录对应的PID; - 最后在
END块中输出三个变量的赋值结果。
内容的提问来源于stack exchange,提问作者Teerawat
相关产品推荐
相关产品推荐

