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

修改ps命令输出分隔符但保留cmd列中的空格

修改ps命令输出分隔符但保留cmd列中的空格

我完全懂你的需求:你需要把ps输出的字段用逗号分隔,但cmd列是完整的命令行,里面的空格必须保留,不能像之前那样被拆成多个逗号分隔的字段。

原来的awk NF=NF OFS=','会把所有空格分隔的字段都换成逗号,自然就把cmd里的每个参数都拆成了独立字段,这显然不是你要的效果。我们可以换个思路:只把前4个固定字段(euser、pid、start_time、etimes)用逗号分隔,第5列及以后的内容(也就是完整的cmd)原样保留,最后把前4部分和cmd部分用逗号连接起来。

直接用这个命令就能解决问题,而且还能省去后面的grep命令(用awk内置的匹配来过滤,更高效):

ps -eo euser,pid,start_time,etimes,cmd | awk '/[m]agento/ {
    # 打印前4个字段,用逗号分隔,最后加一个逗号衔接cmd部分
    printf "%s,%s,%s,%s,", $1, $2, $3, $4;
    # 从第5个字段开始到最后,按原格式打印(保留空格)
    for (i=5; i<=NF; i++) {
        printf "%s%s", $i, (i == NF ? "\n" : " ");
    }
}'

运行效果

执行后你会得到完全符合预期的输出:

root,89070,06:11,58710,/usr/local/bin/php /var/www/html/bin/magento queue:consumers:start product_action_attribute.website.update --single-thread --max-messages=20000
root,89072,06:11,58710,/usr/local/bin/php /var/www/html/bin/magento queue:consumers:start inventory.mass.update --single-thread --max-messages=20000

命令解释

  1. /[m]agento/:过滤包含magento的行,用[m]是为了避免匹配到awk进程本身(和grep -v grep的作用一样,更简洁)
  2. 前半部分printf "%s,%s,%s,%s,":把前4个固定字段用逗号拼接,末尾留一个逗号和后面的cmd部分连接
  3. 循环从第5列到最后一列:逐个打印字段,字段之间用空格分隔,最后一列打印完后换行

如果你想要更紧凑的单行写法,也可以把awk脚本压缩成一行:

ps -eo euser,pid,start_time,etimes,cmd | awk '/[m]agento/{printf "%s,%s,%s,%s,",$1,$2,$3,$4;for(i=5;i<=NF;i++)printf "%s%s",$i,(i==NF?"\n":" ")}'

这个方案完美满足你的需求:既把固定字段用逗号分隔,又完整保留了cmd列里的空格,输出格式完全一致,适合后续在New Relic Flex里做数据转换。

备注:内容来源于stack exchange,提问作者Marisa

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.20 07:18:05