-1

所以我在寻找一种方法来使用管道将 PID 与顶部隔离而无法使用awkor时遇到了一些麻烦perl。到目前为止,我能够隔离特定的用户(不能是您的用户名或 root),现在我不确定如何从这里继续,我尝试过使用cut和其他几个选项,但它不起作用。到目前为止,这是我的工作:

top -n 1 | tail -n +8 | grep -Ev '\broot\b | \bmyUserName\b` 

这会输出减去标题的所有信息,我需要删除除 PID 之外的所有其他内容......有人可以帮忙吗?

编辑:另外,现在似乎可行的只是添加| cut -c 4-11仅显示 PID,因为系统上只有一个不是 root 的其他用户。我不确定如果还有更多它会起作用,但是关于如何使它起作用有什么更好的想法吗?

4

2 回答 2

0

理论上:

top -n 1 | tail -n +8 | grep -Ev ' root | myUserName ' |
sed -e 's/^[ ]*\([0-9][0-9]*\) .*/\1/'

sed命令查找行首、可选空格、后跟数字以及空格和尾随垃圾。但是,这不起作用,因为会top生成屏幕控制字符:

28433 jleffler  20   0 1511m 403m  31m S    2  1.3  70:35.76 chrome  

看起来不错,但是当通过十六进制转储推送时,输出为:

0x0000: 1B 28 42 1B 5B 6D 32 38 34 33 33 20 6A 6C 65 66   .(B.[m28433 jlef
0x0010: 66 6C 65 72 20 20 32 30 20 20 20 30 20 31 35 31   fler  20   0 151
0x0020: 30 6D 20 34 30 34 6D 20 20 33 31 6D 20 53 20 20   0m 404m  31m S  
0x0030: 20 20 34 20 20 31 2E 33 20 20 37 30 3A 33 37 2E     4  1.3  70:37.
0x0040: 38 37 20 63 68 72 6F 6D 65 20 20 20 20 20 20 20   87 chrome       

要抑制这种情况,请使用top -b(批处理模式):

top -b -n 1 | tail -n +8 | grep -Ev ' root | myUserName ' |
sed -e 's/^[ ]*\([0-9][0-9]*\) .*/\1/'

这应该生成一个 PID 列表;它对我有用。

如果您被允许awk,您可以将其简化为:

top -b -n 1 | awk 'NR<=8 || $2~/^(root|myUserName)$/ {next} {print $1}'

所有这一切都基于“使用top是一种好方法”,而不是使用ps(这是用于收集 PID 的常规工具。

于 2013-10-16T20:13:24.300 回答
0

如果您希望所有进程的 PID 不是由rootor生成的,那么您可以使用with和 negation 选项some_user列出这些进程:ps-U user-N

ps -U root -U some_user -N -o pid

-o选项指定我们只对输出中的 PID 感兴趣。现在,您可以轻松地在循环或类似的情况下使用这些 PID 执行某些操作:

for pid in $(ps -U root -U some_user -N -o pid); do
    # something to $pid
done
于 2013-10-16T20:15:04.990 回答