Bash
將字元串中的整數值儲存在rrd中
我想每 10 分鐘從我的 DSL 調製解調器收集一次統計資訊。根據許多網站,最好為此使用 rrd。我的調製解調器(TD-W8968)與 SNMP 鬥爭,所以我製作了一個期望腳本來通過 telnet 提取統計資訊。收集的 crontab 已經設置好了。我的問題是,在用 head 等裁剪不必要的行後,我的統計輸出看起來像這樣:
Status: Showtime Last Retrain Reason: 0 Last initialization procedure status: 0 Max: Upstream rate = 1080 Kbps, Downstream rate = 11128 Kbps Channel: FAST, Upstream rate = 512 Kbps, Downstream rate = 2048 Kbps Link Power State: L0 Mode: G.DMT TPS-TC: ATM Mode Trellis: ON Line Status: No Defect Training Status: Showtime Down Up SNR (dB): 21.8 12.0 Attn(dB): 26.0 15.0 Pwr(dBm): 5.1 4.0
您可以使用awk來處理此類情況。例如,要從您的原始文件中僅提取 2 個 SNR 和 2 個 Attn 號碼,並按照先降後升的順序將它們提供給 rrd:
awk '/^SNR/ { snrdown = $3; snrup = $4; } /^Attn/ { attndown = $2; attnup = $3; } END { data = sprintf("N:%s:%s:%s:%s", snrdown, attndown, snrup, attnup); system("rrdtool update " data " myrrdfile"); }' <rawfile
第一個 awk 行僅匹配以“SNR”開頭的行。預設情況下,awk 將行拆分為由空格分隔的欄位。欄位從 1 開始編號。因此在此範例中,$3 是 21.8 的欄位。該值保存在我們任意命名的變數中。
同樣,awk 的第二行只匹配“Attn”行,但由於它和“(dB)”之間沒有空格,我們的第一個數字在欄位 $2 中。
END 部分在從文件中讀取所有行之後完成
rawfile
。它為 rrd 創建一串數據(需要類似 N:21.8:26.0:…)。格式字元串中的每個都%s
被格式後面的變數之一替換。awk 非常值得了解。它用途廣泛。