使用 bash 中的 ps 和 cut 命令

39
我需要从'ps'中提取PID、UID和命令字段,我尝试了以下命令:ps -L u n | cut -f 1,2,13。出于某种原因,它的行为就像不存在cut命令一样。它只返回正常的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个回答

62

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

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

17

使用“cut”有特殊的原因吗?

我想这个代码会实现你想要的功能:

ps -eopid,uid,cmd

我只是一个初学者,所以尝试自己想的。应该更详细地阅读手册页。谢谢。 - darxsys
3
并非所有的Unix都能提供这些ps选项,而所有的Unix都提供了cut命令。 - sfstewman
POSIX 规范中同时指定了 -e-o该规范确实提到了标准化 ps 的一些困难,因为现有的 BSD 和 System V 实现之间存在很大差异。 - chepner
这对我很有帮助,因为我需要在削减到只有pid之前grep ps的输出。 - GrnMtnBuckeye
在eo和pid之间加上一个空格可以使其更易读,这也是man页面中提到的方式。 - infoclogged

16

你可以使用awk来清理你的命令,像这样:

ps -L u n | awk '{ print $1,$2,$13 }'

-1

问题是一旦你有了一个列表,该怎么办。我觉得cut很笨拙,所以不用cut,我将列表传递给一个while read循环。 "while read"会识别出行中的非空值,所以在这个例子中,"a"是第一个值,"b"是第二个值,"c"是行的剩余部分。我只对前两个值感兴趣,即进程所有者和进程ID;而且我基本上滥用了case语句,而不是使用"if"语句。(尽管grep已经过滤了,但我不想杀死包含所有者名称的其他行中的进程)

ps -ef | grep owner | grep -v grep | while read a b c; 
do 
 case $a in 
  "owner")
     kill -9 $b  
   ;; 
 esac; 
done

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接