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

时间:2010-09-02 19:09:51

标签: linux shell scripting

我的目标是找到消耗最多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 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分: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 }'

答案 2 :(得分:1)

通过挤压所有空白字符来保存输出行:

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)"

等。

被授予,而不是最优雅的方式,但我能提出的最快

答案 3 :(得分:1)

将行放入变量:

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

转换为数组:

LIST=($OUTPUT)

输出字段:

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

答案 4 :(得分:1)

鉴于

# 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

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