修剪ps x以删除进程名称之前的路径

我需要以特定的方式格式化“ 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)最好有一些与路径长度无关的东西。

fql920011429 回答:修剪ps x以删除进程名称之前的路径

以下是一些开头:

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[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,"/");$5=a[n]}1'
21379 ? S 0:00 processA
21381 ? Sl 0:00 nameB -log /home/something/log/nameB/log.ttyS7 /dev/ttyS7
,

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

awk '
   # Remove path from 5th argument
$5 ~ /\// { sub("^.*/","",$5) ; }
    # Print only matching processes
$5 ~ "^(processA|nameB)$" { print $1,$5 }
本文链接:https://www.f2er.com/3159279.html

大家都在问