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

如何在linux shell脚本中从另一个命令(管道)的stdout读取输入?,linux,shell,scripting,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中读取它,但是我想逐字读取上面的输出,或者一个参数一个参数地读取,就像它是从

我的目标是找到消耗最多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}"

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

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


当然,这不是最优雅的方式,但却是我能想出的最快的方式,将行放入变量中:

OUTPUT=`top -b -n 1 | tail -n +8 | head -n 1`
转换为数组:

LIST=($OUTPUT)
并输出以下字段:

echo ${LIST[1]}
echo ${LIST[2]}
使用
set--
强制参数成为位置参数

set -- $(top -b -n 1 | tail -n +8 | head -n 1)
echo " Parameter is ${2} ${3}"
只是为了好玩:)

或者,如果需要其他报告格式:

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

您可以直接将其读入有意义的命名变量:

top -b -n 1 | tail -n +8 | head -n 1 |
    read XPID XUSERID XPRIORITY XVIRTUAL XRESIDENT XSHARED XSTATE XCPU XMEM XTIME XCOMMAND
(唯一的问题是,如果值变得如此之大以至于列彼此接触……在这种情况下,您需要使用类似于带有硬编码列号的cut的内容,而不是依赖于空格分隔)

# 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