Bash

將字元串中的整數值儲存在rrd中

  • September 5, 2015

我想每 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 非常值得了解。它用途廣泛。

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