如何在ps -ef命令中分隔列

时间:2013-09-13 13:50:08

标签: linux bash command

我有命令:

ps -ef | grep kde | tr -s ' ' '@'

我得到这样的输出:

user2131@1626@1584@0@15:50@?@00:00:00@/bin/sh@/usr/bin/startkdeere

如何使用linux或smth等其他类似的符号来获取@符号?

3 个答案:

答案 0 :(得分:1)

讨厌,但它有效。调整数字8以适应ps输出变量的列数。

ps -ef | awk -v OFS =“”'{for(i = 1; i< 8; i ++)printf(“%s @”,$ i); for(i = 8; i< = NF; i ++)printf(“%s”,$ i);的printf( “\ n”)}“

答案 1 :(得分:1)

使用pgrep获取PID,而不是使用pspgrep将消除 grep 问题,其中您发现的其中一个进程是进行过滤的grep

您还可以使用ps-o选项指定-O命令本身的输出。您可以执行此操作以获取所需的字段,并消除标题。

您还可以使用read命令解析输出。您可能有空格的唯一字段是最后一个 - 命令和参数。

ps -o uid= -o gid= -o tty= -o args= -p $(pgrep kde) | while read uid gid tty cmd
do
    echo "UID = $uid   PID = $pid   TTY = $tty"
    echo "Command = $cmd"
done

while将在除$cmd之外的空格上拆分,其中包括所有剩余字段(即包含参数的整个命令)。

ps命令因平台而异,请阅读ps上的联机帮助页。

答案 2 :(得分:0)

如果您的意思是使用'@'作为列/字段分隔符处理输出,则在awk中可以使用-F:

echo "user2131@1626@1584@0@15:50@?@00:00:00@/bin/sh@/usr/bin/startkdeere" | awk -F'@' -v OFS='\t' '{$1=$1;print $0}'

输出:

user2131        1626    1584    0       15:50   ?       00:00:00        /bin/sh /usr/bin/startkdeere