我有以下命令,可以收集一组特定的命令并缩小字段范围;
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-multi
和Python 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