Shell-Script

將 awk printf 字元串轉換為十進制

  • July 29, 2018

任務:

stdout 以十進制形式從頂部開始的負載平均值(例如 0.23)

細節:

我需要將此腳本解析為 Chef 的 inspec 並檢查其結果是否大於/小於某個值,例如:

describe command("top -b -n  1  | awk  '/load average/ { sub(/,/,\".\",$10); printf \"%f\n\",$10}'") do
 its("stdout") { should eq 0.00 }    
end

此範例返回“”

但是現在當我想到它時,我可以與中的文件進行比較/proc/loadavg

進步

使用了這個資源:用 top 獲取平均負載

使用此命令,我可以很好地表示輸出,但它是一個字元串,我無法對其進行任何數學運算:

martin@martinv-pc:~$ top -b -n  1  | awk '/load average/ { printf "%s\n", $10}'
0,63,

但是當我嘗試將 printf 更改為十進制/浮點時,我得到一個錯誤:

martin@martinv-pc:~$ top -b -n  1  | awk '/load average/ { printf "%f\n", $10}'
0.000000
martin@martinv-pc:~$ top -b -n  1  | awk '/load average/ { printf "%d\n", $10}'
0

無法回顯,嘗試剪切,壞主意- 不起作用:

martin@martinv-pc:~$ top -b -n  1  | awk '/load average/ { printf "%s\n", $10}'|cut -c1-4
0,15
martin@martinv-pc:~$ top -b -n  1  | awk '/load average/ { printf "%s\n", $10}'|$((cut -c1-4))
-4: command not found

另一種嘗試:

martin@martinv-pc:~$ top -b -n  1  | awk '/load average/ BEGIN { printf "%.f\n", $10};'
awk: line 1: syntax error at or near BEGIN

問題:

如何將字元串值轉換為 decimal/float/integer ?

ps -o user,rss輸出:

[vagrant@localhost ~]$ ps -o user,rss
USER       RSS
vagrant    736
vagrant   1080

來自gawk: 用逗號分隔符格式化浮點數

答案是使用--use-lc-numericgawk 選項。

–使用-lc-numeric

這會強制 gawk 在解析輸入數據時使用區域設置的小數點字元。儘管 POSIX 標準要求這種行為,並且 gawk 在 –posix 生效時這樣做,但預設情況下遵循傳統行為並使用句點作為小數點,即使在句點不是小數點字元的語言環境中也是如此。此選項覆蓋預設行為,沒有 –posix 選項的完全嚴格的嚴格性。

在您的情況下,此命令應該可以工作:

top -b -n 1 | awk --use-lc-numeric '/load average/ { printf "%f\n", $10}'

您可能正在使用具有,小數點分隔符的語言環境。您可以嘗試以下任何一種方法:

  1. 使用 C 語言環境top
LC_ALL=C top -b -n  1  | awk  '/load average/ { printf "%f\n",$10}'

這不僅解決了句點與逗號的問題,而且還避免了文本load average翻譯成使用者語言等問題。 2. 用點替換逗號:

top -b -n  1  | awk  '/load average/ { sub(/,/,".",$10); printf "%f\n",$10}'
  1. 對於 GNU awk,使用@Leo 建議的--use-lc-numeric標誌或使用.POSIXLY_CORRECT=1 awk
  2. 或者使用一個符合 POSIX 標準的awk實現,比如One True awk ,預設情況下它應該根據語言環境規則解析和列印數字。

請注意,獲取平均負載的更便攜的命令是uptime.

引用自:https://unix.stackexchange.com/questions/458320