我的目标是找到消耗最多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}"
答案 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
(唯一的问题是,如果值变得如此之大,列会相互接触......在这种情况下,您需要使用类似切割的硬编码列号,而不是依赖于空格分隔)