Shell 如何使用'ps'查找命令行?

Shell 如何使用'ps'查找命令行?,shell,command-line,Shell,Command Line,我想找到CPU使用率最高的pid,我的脚本如下: #!/bin/sh ppid=`top -n 1 |sed -n 8p |awk '{print $1}'` echo $ppid ps aux|grep $ppid 但我有一个错误: grep:Unmatched[或[^ 为什么?我如何修复它?因为您的ppid检索空值 更改命令以检索ppid值,如下所示 top -n 1 | sed -n 8p | awk -F " " '{print$2}' 发生的另一件事是顶部进程将立即结束 这是在我的

我想找到CPU使用率最高的pid,我的脚本如下:

#!/bin/sh
ppid=`top -n 1 |sed -n 8p |awk '{print $1}'`
echo $ppid
ps aux|grep $ppid
但我有一个错误:

grep:Unmatched[或[^


为什么?我如何修复它?

因为您的ppid检索空值 更改命令以检索ppid值,如下所示

top -n 1 | sed -n 8p | awk -F " " '{print$2}'
发生的另一件事是顶部进程将立即结束


这是在我的Ubuntu14.04操作系统中。

好的!我找到了!问题是top在它的输出中包含了终端控制序列。所以你实际上在echo中看不到它,但我注意到了,因为它将我的终端会话放在了粗体输出中,后来我试图弄清楚它是如何发生的,并将其追溯到我的测试中因此,grep抱怨的[是在ppid设置的转义序列中。我通过在awk之后添加
| tr-dc 0-9
找到了解决方法,即

ppid=`top -n 1 |sed -n 8p |awk '{print $1}'|tr -dc 0-9`
这将删除结尾处不是数字的任何内容。但我认为,sed也需要调整。而且,我怀疑其中一些数字可能来自转义序列,因此您需要想出一种更干净的方法来删除转义序列


但是,归根结底,这将是非常无用的。每次我运行该管道时,CPU的最高用户都是它的
top
进程。回想起来,这可能并不奇怪。

当所有其他操作都失败时,请检查输入:

$ top -n 1 | awk 'NR==8 {print $1 ": " $2}' | hexdump -C
00000000  1b 28 42 1b 5b 6d 1b 5b  31 6d 31 38 37 31 35 3a  |.(B.[m.[1m18715:|
00000010  20 6a 6b 6c 6f 77 64 65  6e 0a                    | jklowden.|
0000001a
(我缩短了您的命令。几乎所有结合sed和awk的命令都可以用awk更好地表达。然后我添加了第二个字段,以便我们可以看到发生了什么。)

结果是不确定的。top将突出显示已更改的行;为此,它将发出一个ANSI转义序列。如果捕获一个,您将捕获该序列--esc(Besc[mesc[1m--这在ps看来确实非常奇怪。该序列中的括号无疑会引发您的错误消息

为了解决这个问题,你的top可能有一个批处理模式。在我的
top-n1-b
可以解决这个问题

如何使用
ps
查找命令行

恐怕最好的答案是RTFM。ps是那些在不同系统中变化很大的命令之一。我的GNU版本如下:

$ ps -c -f -p $(top -n 1 -b | awk 'NR==8 {print $1}')
UID        PID  PPID CLS PRI STIME TTY          TIME CMD
root      1300     1 TS   19 Jun30 ?        00:14:46 /usr/bin/python /usr/bin/la
其他意见:

  • 喜欢
    $()
    而不是反勾号
  • 虽然这类事情很适合学习,但要寻找不涉及解析交互式实用程序输出的解决方案。在手册中的“帐户”下,您将找到捕获更多信息的方法,而不仅仅是获取当前位于顶部的命令行信息

HTH.

是否
$ppid
包含
[
?它应该转义,因为它是一个特殊字符。我使用“echo$ppid”cmd,但只显示一些数字。这对我来说很有效(用于有限的测试)。如果
ppid
不知何故设置为奇怪的内容,你应该在任何地方引用它(不管怎样,良好的标准做法)。也就是说,在
grep
中,不要说
echo$ppid
,也不要说
echo“$ppid”
。顺便说一句,因为您只需对具有该数字序列的任何行进行grepping,您将看到任何具有pid的行,其中ppid是其子字符串,以及任何恰好在其参数中包含该数字的命令(例如,脚本正在运行的grep命令),或在任何其他
ps aux
字段中。您可能希望使用say
awk
仅与行的正确部分进行比较。请参见下面的答案。您可能需要更复杂的
echo“$ppid”|cat-v
以实际查看它。print$2仅获取用户,而不是pid print$1的输出是什么?如果是pid,则在回答$1中更改