Shell-Script
將 awk printf 字元串轉換為十進制
任務:
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
答案是使用
--use-lc-numeric
gawk 選項。–使用-lc-numeric
這會強制 gawk 在解析輸入數據時使用區域設置的小數點字元。儘管 POSIX 標準要求這種行為,並且 gawk 在 –posix 生效時這樣做,但預設情況下遵循傳統行為並使用句點作為小數點,即使在句點不是小數點字元的語言環境中也是如此。此選項覆蓋預設行為,沒有 –posix 選項的完全嚴格的嚴格性。
在您的情況下,此命令應該可以工作:
top -b -n 1 | awk --use-lc-numeric '/load average/ { printf "%f\n", $10}'
您可能正在使用具有
,
小數點分隔符的語言環境。您可以嘗試以下任何一種方法:
- 使用 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}'
- 對於 GNU
awk
,使用@Leo 建議的--use-lc-numeric
標誌或使用.POSIXLY_CORRECT=1 awk
- 或者使用一個符合 POSIX 標準的
awk
實現,比如One True awk ,預設情況下它應該根據語言環境規則解析和列印數字。請注意,獲取平均負載的更便攜的命令是
uptime
.