我寫了一個小 bash 腳本來檢查我的記憶體使用情況并警告我如果它太高了。
現在我的問題是,我想保留浮動值而不是將其洗掉。但我做不到..
我更喜歡awk而不是其他任何東西,因為它預裝在許多系統上并且我已經在腳本中使用了它。
#!/bin/bash
#define what values are too high (%)
inacceptableRAM="90"
#check RAM %
RAM=`free | grep Mem | awk '{print $3/$2 * 100.0}'`
#send Alarm for RAM
if [ $RAM -ge $inacceptableRAM ] ; then
echo Alarm RAM usage is @$RAM"
fi
那么如何使用 awk 替換我的 if -ge 呢?我認為它應該看起來像: awk ' $RAM >= $inacceptableRAM ' 但是我需要做什么才能讓它在 bash 腳本中作業?
uj5u.com熱心網友回復:
的替代方法awk是bc,例如:
#!/usr/bin/env bash
#define what values are too high (%)
inacceptableRAM="90"
#check RAM %
ram=$(free | awk '/Mem/{print $3/$2 * 100.0}')
#send Alarm for RAM
if (( $(bc <<< "$ram > $inacceptableRAM") )) ; then
echo "Alarm RAM usage is @$ram"
fi
uj5u.com熱心網友回復:
由于您正在與整數進行比較,因此您可以在比較時去掉小數部分:
if [ "${RAM%.*}" -ge "$inacceptableRAM" ] ; then
如果要完全做到這一點awk,唯一棘手的事情是,你必須使用-v var=value到轉換inacceptableRAMshell變數為awk變數:
free | awk -v limit="$inacceptableRAM" '/Mem/ {ram=$3/$2*100; if (ram>=limit) print ram}'
請注意,我/Mem/在awk腳本中使用來有效地替換grep命令。從grep到管道awk幾乎從來沒有必要,因為你可以在awk.
其他建議:使用$( )代替反引號進行命令替換,并使用小寫或混合大小寫的變數名稱(例如ram代替ram)以避免意外使用具有特殊含義的許多全大寫名稱之一。
uj5u.com熱心網友回復:
你試圖在 shell 中做太多事情。Shell 是一種用于操作檔案以及處理和排序對其他工具的呼叫的工具。創建 shell 的人也為 shell 創建的用于呼叫以操作文本的工具是 awk:
#!/usr/bin/env bash
free |
awk '
BEGIN {
#define what values are too high (%)
unacceptableRam = 90
}
/Mem/ {
#check RAM %
ram = ( $2 ? $3 / $2 * 100 : 0 )
#send Alarm for RAM
if ( ram >= unacceptableRam ) {
print "Alarm RAM usage is @" ram
}
}
'
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/361162.html
