在今天之前,尽管对许多不同的Linux命令越来越感到满意,但我还没有尝试理解a useful command from another StackOverflow posting的某些组件来将top
命令过滤到某些进程(按进程名称) :
top -p `pgrep process-name | tr "\\n" "," | sed 's/,$//'`
此top
命令包含各种语法组件。我可以依次查找每个组件(有些是显而易见的,例如管道命令 - 尽管我仍然没有 100%对管道|
和重定向>
)。
但是,因为按进程名称过滤top
命令通常很有用,并且因为从语法角度来看,该命令显然不是微不足道的,所以对我(也许是其他人)来说这对我来说很有用在一个地方引用对该命令的所有部分的实际(简要)解释。
因此,我的问题如下。
上述top
命令的所有组件(按进程名称过滤top
的输出)的简要说明是什么?如果只是简单提一下,我将不会留下任何语法。谢谢!
答案 0 :(得分:2)
管道接受左侧命令的输出,并将其用作右侧命令的输入。因此pgrep
的输出转到tr
,然后转到sed
。反引号意味着执行命令并返回一些东西。在这种情况下,top -p
正在寻找进程ID。
基本上它会查找process-name
通过tr
和sed
进行一点格式化的过程,并为top -p
提供一个可读数字,它提供内存,CPU使用率等
pgrep
基本上grep
ps aux
tr
将所有\\n
替换为,
sed
删除,
($
表示用作故障保护的字符串结尾)top -P
,它提供正在运行的系统的动态实时视图。
它可以显示系统摘要信息以及任务列表
目前由Linux内核管理man pgrep
man tr
man sed
man top
答案 1 :(得分:2)
我会尝试通过分解回答你的问题来打破它。
我们要看的第一部分是sed 's/,$//'
。我无法简要解释sed
命令,但请查看GNU sed manual以获取更多信息。 's/,$//'
告诉sed
在一行的末尾查找任何逗号,并将其替换为空。这是从sed
标准输入的每一行末尾删除所有逗号。
我们要看的下一篇文章是tr "\\n" ","
。同样,tr
可以做很多事情,但其目的是转换角色。有关更详细的说明,请参阅tr man page。这种用法是将所有UNIX换行符(\n
)转换为逗号。 \
必须使用额外的\
进行转义,因为命令行会将\n
视为新行并中断命令。
接下来是pgrep process-name
。完整性为pgrep man page。 pgrep
只是将与选择条件匹配的任何正在运行的进程的进程ID(pid)打印到标准输出。每个pid将自行打印在一条线上。在这里,我们正在寻找命令process-name
的pid。
现在为管道(|
)。这将创建一个新流程,并将标准输出的任何内容发送到新流程的标准中。
让我们看看命令,以了解管道如何更好地工作。 pgrep process-name | tr "\\n" ","
会将所有匹配process-name
的pid打印到标准输出,并将其传递给运行tr
的流程的标准输入。 tr "\\n" "," | sed 's/,$//'
会将所有换行符从其标准转换为逗号,并将结果打印到其标准输出,该标准输出将传递给运行sed 's/,$//'
的新进程。
因此,对于任何名为pgrep process-name | tr "\\n" "," | sed 's/,$//'
的正在运行的进程,整个命令process-name
将为空格分隔的pid行打印。
另外两件要看:top -p
和反引号(``)。反引号创建一个新进程,在命令内部运行命令并在评估整个命令之前替换其标准。例如:
echo `echo "Hello, World!"`
将Hello, World!
打印到屏幕上。
最后,top -p
获取pid列表并报告各种信息,例如运行时,内存使用情况和nice值。有关更详细的说明,请参阅top man page。
答案 2 :(得分:1)
pgrep process-name | tr "\\n" "," | sed 's/,$//'
这部分给出了一个逗号分隔的进程列表,该列表给出了显示资源使用情况的top
命令。
它可以重写为:
process_list=$(pgrep process-name | tr "\\n" "," | sed 's/,$//')
top -p ${process_list}
1)pgrep process-name
- 获取process-name
的进程ID列表(如果正在运行)
2)tr "\\n" ","
- pgrep
命令的输出位于不同的行中。所以这部分删除换行符(如果有的话)并用逗号分隔它们
3)sed 's/,$//'
- 此部分删除尾随逗号。 $
代表"行尾"并且,$
代表尾随逗号。 s/,$//
代替"行尾" (即最后一个)逗号 nothing 即删除尾随逗号。
E.g。
如果pgrep process-name
给出的输出如下:
4560
5000
然后它首先变为:4560,5000,
(tr
)
然后变为4560,5000
(按sed
)
然后最终传递给top
:top -p 4560,5000
,它只显示这两个过程。
答案 3 :(得分:1)
top -p
的一种语法是-pN1,N2,N3 ...
,其中N1,N2和N3是进程ID。 pgrep
获取与process-name
匹配的进程ID,而tr "\\n" "," | sed 's/,$//'
尝试将输出转换为逗号分隔值。这个结果csv作为参数传递给top -p
,因为它是在命令替换下的事实。
为了更容易理解,让我们开始使用变量:
获取进程ID。
PIDS=$(pgrep process-name)
将换行符转换为逗号。
CSV=$(echo -n "$PIDS" | tr "\\n" ",")
最后删除额外的逗号。在我们的步骤中这可能不是必要的,这要归功于命令替换在最后删除了额外的换行符,但管道是必要的。
CSV=$(echo -n "$CSV" | sed 's/,$//')
跑顶。
top -p "$CSV"
如果我们使用指定输出分隔符的-d
pgrep
选项,它可以更有效,更容易完成命令:
top -p "$(pgrep process-name -d ,)"