代码之家  ›  专栏  ›  技术社区  ›  Vivek Bernard

如何从Linuxshell脚本中的另一个命令(管道)中读取stdout的输入?

  •  3
  • Vivek Bernard  · 技术社区  · 14 年前

    我的目标是找到消耗最多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}"
    
    5 回复  |  直到 7 年前
        1
  •  1
  •   Richard Fearn    14 年前

    将行转换为变量:

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

    转换为数组:

    LIST=($OUTPUT)
    

    输出字段:

    echo ${LIST[1]}
    echo ${LIST[2]}
    
        2
  •  2
  •   glenn jackman    14 年前

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

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

    只是为了好玩:

    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 }'
    
        4
  •  1
  •   polemon    14 年前

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

    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
  •  1
  •   Tony Delroy    14 年前

    鉴于

    # 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
    

    (唯一的问题是,如果值太大,列会互相接触…在这种情况下,您需要使用类似于用硬编码的列号剪切的内容,而不是依赖于空格分隔)