以下" top"的语法的简要说明是什么?命令:top -p`pgrep process-name | tr" \\ n" "" | sed' s /,$ //'`

时间:2014-07-31 18:12:22

标签: linux bash sed grep

在今天之前,尽管对许多不同的Linux命令越来越感到满意,但我还没有尝试理解a useful command from another StackOverflow posting的某些组件来将top命令过滤到某些进程(按进程名称) :

top -p `pgrep process-name | tr "\\n" "," | sed 's/,$//'`

top命令包含各种语法组件。我可以依次查找每个组件(有些是显而易见的,例如管道命令 - 尽管我仍然没有 100%对管道|和重定向>)。

但是,因为按进程名称过滤top命令通常很有用,并且因为从语法角度来看,该命令显然不是微不足道的,所以对我(也许是其他人)来说这对我来说很有用在一个地方引用对该命令的所有部分的实际(简要)解释。

因此,我的问题如下。

上述top命令的所有组件(按进程名称过滤top的输出)的简要说明是什么?如果只是简单提一下,我将不会留下任何语法。谢谢!

4 个答案:

答案 0 :(得分:2)

管道接受左侧命令的输出,并将其用作右侧命令的输入。因此pgrep的输出转到tr,然后转到sed。反引号意味着执行命令并返回一些东西。在这种情况下,top -p正在寻找进程ID。

简要说明:

基本上它会查找process-name通过trsed进行一点格式化的过程,并为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 pagepgrep只是将与选择条件匹配的任何正在运行的进程的进程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
然后最终传递给toptop -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 ,)"
相关问题