0

我需要以特定方式格式化命令“ps x”的输出,以便删除进程前面的路径名,可能使用 awk 或 sed。

例如:如果命令“ps x”给出以下输出:

$ps x 

21379 ?        S      0:00 /home/something/etc/processA
21381 ?        Sl     0:00 /home/something/bin/nameB -log /home/something/log/nameB/log.ttyS7 /dev/ttyS7

我想要如下输出:

21379 ? S  0:00 processA
21381 ? Sl 0:00 nameB  -log /home/something/log/nameB/log.ttyS7 /dev/ttyS7

另外,最好知道如何获得:

21379 ? S  0:00 processA
21381 ? Sl 0:00 nameB

到目前为止,我做了一些依赖于路径长度的事情,而且我必须删除 grep 进程。

$ps x | grep -v grep | grep -e processA -e nameB | awk -F '[/]' {'print $1" "$2" "$3" "$4" "$5'} | awk {'print $1" "$2" "$3" "$4" "$8'}

这使

21379 ? S 0:00 processA
21381 ? Sl 0:00 nameB

由于遗留代码的原因,我不能使用“ps -e -o pid,tty,stat,time,comm”。

更新 1)最好有一些与路径长度无关的东西。

4

2 回答 2

1

这里有一些开始:

ps x | awk '{n=split($5,a,"/");print $1,$2,$3,$4,a[n]}'
21379 ? S 0:00 processA
21381 ? Sl 0:00 nameB


ps x | awk '{n=split($5,a,"/");print $1,$2,$3,$4,a[n],$6,$7,$8}'
21379 ? S 0:00 processA
21381 ? Sl 0:00 nameB -log /home/something/log/nameB/log.ttyS7 /dev/ttyS7


ps x | awk '{n=split($5,a,"/");$5=a[n]}1'
21379 ? S 0:00 processA
21381 ? Sl 0:00 nameB -log /home/something/log/nameB/log.ttyS7 /dev/ttyS7
于 2019-11-05T13:31:59.300 回答
0

您可以使用单个 awk 脚本来完成所有任务

awk '
   # Remove path from 5th argument
$5 ~ /\// { sub("^.*/", "", $5) ; }
    # Print only matching processes
$5 ~ "^(processA|nameB)$" { print $1, $2, $3, $4, $5 }
于 2019-11-05T13:38:46.407 回答