我有命令:
ps -ef | grep kde | tr -s ' ' '@'
我得到这样的输出:
user2131@1626@1584@0@15:50@?@00:00:00@/bin/sh@/usr/bin/startkdeere
如何使用linux或smth等其他类似的符号来获取@符号?
答案 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,而不是使用ps
。 pgrep
将消除 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