【问题标题】:BASH script help using TOP, GREP and CUT使用 TOP、GREP 和 CUT 的 BASH 脚本帮助
【发布时间】:2017-11-12 17:13:38
【问题描述】:

使用 Top 命令重复 5 次,将结果通过管道传送到 Grep 和 Cut 命令以打印 init 屏幕上的进程。

大家好,我有我的代码行:

top -n 5 | grep "init" | cut -d" " -f3 > topdata

但我看不到任何输出来验证它是否正常工作。 此外,下一个脚本要求我使用单行命令来显示以兆字节为单位的总内存使用量。我应该将 Free 的结果通过管道传输到 Grep,以选择或过滤模式为“Total:”的行,然后将该结果通过管道传输到 Cut 并显示代表使用的总内存的数字。到目前为止:

free -m -t | grep "total:" | cut -c25-30

也没有得到任何打印回报。任何帮助表示赞赏。

【问题讨论】:

  • 1) grep 区分大小写。 free 说“Total”,你用 grep 表示“total”。所以不匹配! grep 表示“总计”或使用 grep -i。
  • 2) 当我需要从一行中取出一个数字时,我更喜欢 awk 而不是 cut。您不知道该数字的长度,但您知道它将是 Total: 之后的第一个数字。所以:免费 -m -t | grep "总计:" | awk '{print $2}'

标签: bash shell grep cut


【解决方案1】:

扩展我的 cmets:

  1. grep 区分大小写。 free 说“Total”,你用 grep 表示“total”。所以不匹配! grep 表示“总计”或使用 grep -i。
  2. 当我需要从一行中取出一个数字时,我更喜欢 awk,而不是 cut。您不知道该数字的长度,但您知道它将是 Total: 之后的第一个数字。所以:

free -m -t | grep "Total:" | awk '{print $2}'

  1. 对于您的 top 命令,如果您没有 init 进程(您应该这样做,但它可能不会显示在 top 中),只需 grep 查找其他内容以查看您的代码是否有效。我用肉桂(运行薄荷)。最上面的命令是:

top -n 5 | grep "cinnamon" | awk '{print $1}'

根据您的要求将“cinnamon”替换为“init”。为什么 awk 中有 1 美元?我的顶部将 PID 放在第一列。相应调整。

总的来说,当你有一个由某个字符分隔的字符串时,使用 cut 是很好的。前任。 aaa;bbb;ccc,你会切断 -d';'。但是这里的数字可能有不同的长度,所以使用 cut 不是(恕我直言)最好的解决方案。

【讨论】:

  • Nic3500,谢谢。但是,对于这个练习作业,我们应该使用这些命令,而不是 awk 或 sed。
  • 啊,好吧,所以使用 cut 与您发布的位置参数一样,可以工作。无论如何,您的免费 grep 是错误的,并解释了缺少输出。
  • 对于init,它不会出现在top很高的位置,因为它使用0 cpu,所以它只会出现在top list的总末尾。 top 显示了使用 CPU 最高的命令,所以 init 不会显得很他。
  • 或者使用:top -p 1。init的PID是1,所以top只会监控那个。
  • 无论用什么措辞,我都没有输出。例如:顶部 -n 5 -p 1 | grep "初始化" | cut -d" " -f5 什么都不做......它按照要求重复前 5 次,但根本没有输出,而当我使用“netns”时,我确实得到了输出。也许虚拟机很糟糕
【解决方案2】:

init 进程的 PID 为 1,没有理由这样做。

一般要查找进程的 PID,我建议:

pidof <name>

【讨论】:

  • 虽然您适合 pidof 命令,但这不是 OP 所要求的(答案不完整)。
  • @Nic3500 我回答了 OP:s 的一个问题。毕竟,你不应该在一个问题中问多个问题。
猜你喜欢
  • 2016-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-12
  • 2015-09-29
  • 1970-01-01
  • 2021-04-17
  • 1970-01-01
相关资源
最近更新 更多