我正在撰寫一個 shell 腳本來決議ethtool命令中的廣告模式和支持的模式,并將它們與預期值進行匹配。這個想法是預期和支持的模式都應該有一個共同的值來傳遞條件。
資料:
# ethtool eth5
Settings for eth1:
Supported ports: [ Backplane ]
Supported link modes: 1000baseKX/Full
10000baseKR/Full
15000baseKR/Full
Supported pause frame use: Symmetric
Supports auto-negotiation: Yes
Supported FEC modes: None BaseR RS
Advertised link modes: 1000baseKX/Full
10000baseKR/Full
15000baseKR/Full
我目前使用以下相同。
link_mode_expected=15000baseKR
# get the mode using the shell command and parse the value needed
mode_supported=`ethtool ${eth_device} | sed -ne '/Supported link modes:/,/:/p' |\
sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//' | grep "$link_mode_expected"`
mode_advertised=`ethtool ${eth_device} | sed -ne '/Advertised link modes:/,/:/p' |\
sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//' | grep "$link_mode_expected"`
if [ "$mode_supported" != "$link_mode_expected" ] ||\
( [ "$mode_supported" != "$mode_advertised" ] ) ; then
#some action
fi
上面的代碼給出了正確的結果,即 15000baseKR/Fullmode_advertised并且mode_supported我正在做上面的邏輯,但我正在尋找下面的幫助
- 如何避免兩個
ethtool命令,我們可以將輸出添加到緩沖區并從該緩沖區 grep 嗎? - awk 的等效項是什么,如果 awk 執行速度更快?
- 有沒有比上述更好的方法?
uj5u.com熱心網友回復:
awk 確實會在這里回答你所有的問題。
link_mode_expected=15000
if ethtool "$eth_device" |
awk -v lme="$link_mode_expected" '
s && /:/ { s=0 }
/Supported link modes:/ { s=1 }
s && ($NF 0 == lme) { sgood }
a && /:/ { a=0 }
/Advertised link modes:/ { a=1 }
a && ($NF 0 == lme) { agood }
END { exit 1-(agood && sgood) }'
then
# some action
fi
演示,帶有一些除錯列印:https ://ideone.com/v5du8g
讓 Awk 執行比較并設定其退出狀態以if進行檢查在 Awk 方面有點笨拙,但使腳本非常容易和自然地從周圍的 shell 腳本中使用。
就像sed,Awk 每次迭代處理一行(或者,更具體地說,一條記錄)。在此腳本中,簡單變數s和a反映當前輸入行是否在分別列舉支持或廣告模式的區域內。如果我們在這樣的區域,我們檢查行 () 上的最后一個欄位是否在$NF數字上 () 計算 0為 中的數字lme。在這種情況下,Awk 可以方便地忽略值上的任何非數字尾部。最后,根據 shell 的約定,我們將退出狀態設定為 0 表示成功(兩個值都已找到),否則設定為 1(零退出代碼表示成功,否則為失敗)。
作為一種替代方法,您可以嘗試找出RS要拆分的記錄分隔符 ( ),而不是換行符。在冒號上拆分可能會很好,因為這樣您就可以一次檢查整個區域(但是您會失去NF包含要檢查的欄位索引的簡單而優雅的功能,因此在結束)。
您也可以選擇簡單地讓 Awk 提取并列印值,然后在 shell 中進行比較;但是讓 shell 決議來自 Awk 的輸出,而您剛剛花費了這么多時間來決議它是生硬且沒有吸引力的。
這個腳本并不完全是微不足道的,但是您應該會發現學習足夠多的 Awk 來撰寫更簡單的腳本是非常愉快和快速的,并且非常值得您花時間。您可以在 30 分鐘到 1 小時的預算內走得很遠。
需要自定義決議器的 Ad-hoc 輸出格式一直是令人沮喪和摩擦的根源。越來越多的現代工具可以選擇以適當的機器可讀標準格式(如 JSON、YAML 或 XML)生成輸出。唉,ethtool不幸的是似乎沒有任何這樣的設施。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/523003.html
標籤:linux壳awksed
上一篇:SpringCloud微服務實戰——搭建企業級開發框架(四十八):【移動開發】整合uni-app搭建移動端快速開發框架-使用第三方UI框架
