-2

我有命令:

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

我得到这样的输出:

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

如何使用 linux 或 awk 之类的其他方法获取 @ 符号仅用于列分隔?

4

3 回答 3

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")}'
于 2013-09-13T14:33:47.440 回答
1

用于pgrep获取您的 PID,而不是使用ps. pgrep将消除您发现的过程之一是进行过滤的grep问题。grep

您还可以使用or选项指定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.

于 2013-09-13T14:41:46.033 回答
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
于 2013-09-13T13:55:20.940 回答