2012-11-27 59 views
1

所以我寫了一個bash腳本,它必須根據命令「ps u」計算出總共使用了多少CPU。我試圖使用awk,如下所示:awk問題:總結非整數的問題?

TOTAL_CPU=$(ps u | awk '{sum = sum + $3}; END {print sum}') 

命令「ps u」的典型輸出有11列,第3列是CPU使用率。

問題是,這是不應該像它應該工作。當CPU值有小數時,我得到這樣的錯誤:

syntax error: invalid arithmetic operator (error token is ".x") 

其中x是總和後的「剩餘」小數。例如,如果值爲「1.4」和「8.7」​​,則總和爲「10.1」,因此錯誤將會說:

syntax error: invalid arithmetic operator (error token is ".1") 

我該怎麼做我需要的?沒關係,如果小數被截斷,我不需要很多的精度。

編輯:文章編輯器中修改了什麼我原本寫

EDIT2:問題解決了!根本不是awk的錯;事實證明,這行代碼是隱藏在別處:

declare -i TOTAL_CPU 

所以慶典試圖像「3.4」的值分配給預計將只包含整數值的變量。我把這個放在這裏,以防有人通過以後通過谷歌找到這篇文章!

+0

這適用於我在bash中的命令行和腳本。也許你可以發佈你的完整腳本。可能是這個命令以外的其他問題。 – ghoti

回答

1

更改它:

TOTAL_CPU=ps u | awk '{sum = sum + $3}; END {print sum}' 

要:

TOTAL_CPU=$(ps u | awk '{sum = sum + $3}; END {print sum}') 

這不是一個awk問題,而是你的bash語法。

$(...)表示法被稱爲Command Substitution。基本上,它會從當前shell衍生出一個新的子shell以執行它所包含的任何命令,然後將輸出返回到新的子shell的stdout

+0

堆棧溢出編輯器改變了它。我使用「''」運算符而不是$()來執行相同的操作。 –

+0

@DemianDawid,然後我不確定問題可能是什麼,我剛剛按照描述運行了'TOTAL_CPU = $(ps u | awk'{sum = sum + $ 3}; END {print sum}')',並且當我'echo $ TOTAL_CPU'時,我的標準輸出 –

+0

上有'7.3',這很奇怪。我也在終端上測試過它,它可以正常工作,但是在腳本內部卻沒有。一段時間以來,它一直讓我瘋狂...... –

2

查看系統聯機幫助頁中的ps命令。您可以重新格式化ps輸出以獲得您想要的內容。例如,你可以打印出的CPU數量,忘記輸出的其餘部分:

sum=$(ps -udavid -o %cpu | tail -n +2 | paste -sd+ - | bc) 
  • ps -udavid:處理由大衛
  • ps -udavid -o %cpu資:由大衛擁有的進程。只是示出了CPU
  • tail -n +2:刪除標題行(所有線2爲底)
  • paste -sd+ --s意味着所有行中一行結合在一起。 d+表示在每個之後放置一個+符號。最後的-表示使用STDIN。
  • bc計算行數。由於所有數字都被+符號分開,因此它會將所有CPU數量加在一起。
+0

我喜歡這種技術的美學。我將這兩個示例放在快速的Perl基準測試中(即Benchmark :: cmpthese)。對於它的價值,管道​​技術的出現速度提高了13%左右。 – ddoxey

+0

謝謝,我會試試這個! –