【问题标题】:How to read input from the stdout of another command (pipe) in linux shell script?如何从 linux shell 脚本中另一个命令(管道)的标准输出读取输入?
【发布时间】:2010-09-02 19:09:50
【问题描述】:

我的目标是找到消耗最多 CPU 和 RAM 的进程 通过编写脚本。我已经设法从 TOP 命令中提取信息,但是在解析输出时遇到了问题。

以下命令,

top -b -n 1 | tail -n +8 | head -n 1

会输出类似这一行的东西,

915 root      20   0  209m  74m 8644 S    8  7.7   5:27.57 Xorg

我希望这行文本成为我的脚本的参数列表。我意识到我必须从 STDIN 读取它,但是,我想逐字读取上述输出,或者逐个参数读取,就好像它是从命令行给出的一样。

echo " Parameter is ${2} ${3}"

【问题讨论】:

    标签: linux shell scripting


    【解决方案1】:

    使用set -- 强制参数成为位置参数。

    set -- $(top -b -n 1 | tail -n +8 | head -n 1)
    echo " Parameter is ${2} ${3}"
    

    【讨论】:

      【解决方案2】:

      只是为了好玩:)

      top -b -n1 | head -8 | tail -2 | awk '
      {
          if (NR==1) {
              print "\nHey teacher, leave those kids alone! - Pink Floyd ;)\n";
              print $2,$1,$9,$10;
              next;
          }
          print $2,$1,$9,$10;
      }'
      

      或者如果您想要其他报告格式:

      top -b -n1 | head -8 | tail -1 | awk '{ printf "User: %s\nPID: %s\nCPU Usage: %s\nMEM Usage: %s\n", $2,$1,$9,$10 }'
      

      【讨论】:

        【解决方案3】:

        将行放入变量中:

        OUTPUT=`top -b -n 1 | tail -n +8 | head -n 1`
        

        转换为数组:

        LIST=($OUTPUT)
        

        并输出字段:

        echo ${LIST[1]}
        echo ${LIST[2]}
        

        【讨论】:

          【解决方案4】:

          压缩所有空白字符保存输出行:

          LINE=$(top -b -n 1 | tail -n +8 | head -n 1 | tr -s ' ')
          

          然后使用cut 得到你想要的部分:

          echo " Parameter is $(echo $LINE | cut -d' ' -f2) $(echo $LINE | cut -d' ' -f3)"
          

          等等。

          当然,不是最优雅的方式,但我能想到的最快的方式

          【讨论】:

            【解决方案5】:

            给定

            # 915 root      20   0  209m  74m 8644 S    8  7.7   5:27.57 Xorg  
            

            你可以直接把它读成有意义的变量:

            top -b -n 1 | tail -n +8 | head -n 1 |
                read XPID XUSERID XPRIORITY XVIRTUAL XRESIDENT XSHARED XSTATE XCPU XMEM XTIME XCOMMAND
            

            (唯一的问题是,如果值变得如此之大,列相互接触...在这种情况下,您需要使用诸如 cut 硬编码列号之类的东西,而不是依赖空格分隔)

            【讨论】:

              猜你喜欢
              • 2012-04-15
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2021-04-29
              相关资源
              最近更新 更多