如何在Linux shell脚本中从另一个命令的标准输出(管道)中读取输入?

3
我的目标是编写一个脚本来查找消耗最多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

我希望这行文本成为我的脚本的参数列表。我知道必须从标准输入读取它,但我想逐字逐句地读取上面的输出,就像从命令行给出一样。

echo " Parameter is ${2} ${3}"
5个回答

2

Just for fun :)

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
使用 set -- 命令可以将参数强制转换为定位参数。
set -- $(top -b -n 1 | tail -n +8 | head -n 1)
echo " Parameter is ${2} ${3}"

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

等等。

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


1

将行存入变量中:

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

转换为数组:

LIST=($OUTPUT)

并输出这些字段:

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

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

唯一的问题是如果值变得非常大,列会彼此接触...在这种情况下,您需要使用类似于硬编码列号的剪切而不是依赖于空格分隔的内容。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接