You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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
}'

逻辑说明

  1. 用split()函数将-Dapex=XXX分割成数组,提取出后面的标识内容;
  2. 统计APEC出现的次数,分别记录第一次和第二次出现的PID;
  3. 遇到JAAA标识时直接记录对应的PID;
  4. 最后在END块中输出三个变量的赋值结果。

内容的提问来源于stack exchange,提问作者Teerawat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 10:35:34