2010-09-02 76 views
3

我的目標是通過編寫一個腳本來查找耗用最多CPU和RAM的進程 。我設法從TOP命令提取信息,但是,我無法解析輸出。如何從linux shell腳本中的另一個命令(管道)的標準輸出讀取輸入?

下面的命令,

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

回答

1

獲取行成一個變量:

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

轉換爲數組:

LIST=($OUTPUT) 

和輸出領域:

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

日Thnx人 !一直在嘗試幾個小時。 – 2010-09-02 19:36:13

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

授予,而不是最優雅的方式,但最快我可以拿出

2

使用set --迫使參數成爲位置參數。

set -- $(top -b -n 1 | tail -n +8 | head -n 1) 
echo " Parameter is ${2} ${3}" 
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 }' 
1

鑑於

# 915 root  20 0 209m 74m 8644 S 8 7.7 5:27.57 Xorg 

你可以直接閱讀所有到meaninfully命名變量:

top -b -n 1 | tail -n +8 | head -n 1 | 
    read XPID XUSERID XPRIORITY XVIRTUAL XRESIDENT XSHARED XSTATE XCPU XMEM XTIME XCOMMAND 

(唯一的問題是,如果值獲得如此大的列相互接觸......在這種情況下,你需要使用像切與硬編碼的列數,而不是依靠空白分離)

相關問題