更改 ps -eo 分隔符但在 cmd 列中保留空格

更改 ps -eo 分隔符但在 cmd 列中保留空格

我有以下命令,可以收集一组特定的命令并缩小字段范围;

ps -eo euser,pid,start_time,etimes,cmd | grep -e "magento" | grep -v grep

这就是我得到的;

root       89070 06:11   58310 /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   58310 /usr/local/bin/php /var/www/html/bin/magento queue:consumers:start inventory.mass.update --single-thread --max-messages=20000

当 shell 进入时,这很好,并显示我需要的内容。但是,我想将分隔符更改为其他内容,例如逗号、竖线或输出中未使用的其他字符。

我尝试了awk这样的解决方案;

ps -eo euser,pid,start_time,etimes,cmd | awk NF=NF OFS=',' | grep -e "magento" | grep -v grep

我得到了这个作为输出;

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

cmd列中应该有空格,因为这是正在运行的命令,我需要该特定信息,以便可以在 New Relic Flex 集成中对其进行转换。我发现数据的一致性通常是理想的,它使流数据按预期呈现。

我确实需要输出看起来像这样;

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

但我不太清楚如何实现。我更喜欢一行代码即可实现,但如果需要脚本也可以。我有GNU bash, version 5.1.16(1)-release (x86_64-pc-linux-gnu)perl 5, version 34, subversion 0 (v5.34.0) built for x86_64-linux-gnu-thread-multiPython 3.10.6可供使用。

[编辑] 提供的答案准确地返回了我需要的内容,但有一个例外,我需要按行返回,所以这是我正在使用的,以防以后有人遇到类似的问题;

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

答案1

使用相同的逻辑,您需要:

ps -eo euser,pid,start_time,etimes,cmd | 
    awk -v NF=NF '
        /[m]agento/{
            for (i=1; i<=NF; i++) {
                if (i<5) printf "%s,", $i
                else printf "%s ", $i
            }
        }
        i==(NF-1){print ""}
' file

相关内容