我有命令:
ps -ef | grep kde | tr -s ' ' '@'
我得到这样的输出:
user2131@1626@1584@0@15:50@?@00:00:00@/bin/sh@/usr/bin/startkdeere
如何使用 linux 或 awk 之类的其他方法获取 @ 符号仅用于列分隔?
讨厌,但它的工作原理。调整数字 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")}'
用于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
.
如果您的意思是使用“@”作为列/字段分隔符来处理您的输出,那么在 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