34

我需要从“ps”中提取 PID、UID 和命令字段,我已经尝试过这样的操作:

ps -L u n | cut -f 1,2,13

由于某种原因,这表现为没有任何剪切命令。它只是返回正常的 ps 输出。然后,我尝试了

ps -L u n | tr -s " " | cut -d " " -f 1,2,13这完全是胡说八道。然后,我尝试使用它并使用它:

ps -L u n | tr -s " " | cut -d " " -f 2,3,14

这以某种方式返回了我需要的东西(几乎,我不明白为什么它几乎可以工作),除了它切断了它中间的命令字段。我怎样才能得到我需要的东西?

4

4 回答 4

56

ps正在打印空格分隔符,但cut-d使用制表符。将tr -s空格压缩在一起以获得更多所需的分隔,但请记住,存在初始的一组空格(压缩为一个),因此您需要在每个字段中添加 1。此外,每个单词的命令中都有空格。这应该有效:

ps -L u n | tr -s " " | cut -d " " -f 2,3,14-
于 2013-03-26T17:44:35.717 回答
15

您可以使用 awk 来清理您的命令,如下所示:

ps -L u n | awk '{ print $1,$2,$13 }'
于 2013-03-26T18:12:41.360 回答
15

使用 cut 有什么特别的原因吗?

我想这会做你想要的:

ps -eopid,uid,cmd
于 2013-03-26T17:43:56.813 回答
-1

问题是一旦你有了一个清单该怎么做。我发现cut kludgy,所以我没有 cut我将列表传递给while read循环。“While read”识别一行中的非空白值,因此在本例中,“a”是第一个值,“b”是第二个值,“c”是该行的其余部分。我只对前 2 个值,进程所有者和进程 ID 感兴趣;我基本上滥用案例陈述而不是使用“如果”。(即使 grep 过滤,我也不想杀死所有者名称可能嵌入在行中其他位置的进程)

ps -ef | grep owner | grep -v grep | while read a b c; 
do 
 case $a in 
  "owner")
     kill -9 $b  
   ;; 
 esac; 
done
于 2018-12-13T23:01:37.780 回答