所以我在找到一种方法来使用管道将PID与顶层隔离并且无法使用awk
或perl
时遇到了一些麻烦。到目前为止,我能够隔离特定的用户(不能是你的用户名或root用户),现在我不确定如何从这里开始,我尝试使用cut
和其他几个选项,但它不是工作。到目前为止,这是我的工作:
top -n 1 | tail -n +8 | grep -Ev '\broot\b | \bmyUserName\b`
这会输出所有信息减去标题,除了PID之外我还需要删除其他所有内容......任何人都可以提供帮助吗?
编辑:此外,现在似乎工作的只是添加| cut -c 4-11
,它只显示PID,因为只有一个其他用户不是系统上的root用户。我不确定它是否会有效,但有没有更好的想法如何让它发挥作用?
答案 0 :(得分: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的常用工具。
答案 1 :(得分:0)
如果您希望root
或some_user
未生成所有流程的PID,则可以使用ps
和-U user
以及否定选项{{1}列出这些流程}}:
-N
ps -U root -U some_user -N -o pid
选项指定我们只对输出中的PID感兴趣。
现在,您可以在循环或类似的环境中轻松地使用这些PID:
-o