10分ごとにDSLモデムから統計を収集したいと思います。多くのウェブサイトによると、この目的のためにrrdを使用するのが最善です。私のモデム(TD-W8968)はSNMPを使用できないため、Telnetを介して統計を取得するための予想スクリプトを作成しました。収集されたcrontabが設定されました。私の問題は、ファーストクラスで不要な行を切り取った後、統計出力が次のようになることです。
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
答え1
あなたはそれを使用することができますアッそのような状況に対処するため。たとえば、ソースファイルから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のフィールドです。この値は、ランダムに名前付き変数に保持されます。
同様に、2番目のawk行は「Attn」行にのみ一致しますが、その行と「(dB)」の間にスペースがないため、最初の数字は$ 2フィールドにあります。
ファイルのすべての行を読んだ後、ENDセクションを完了してくださいrawfile
。 rrdのデータ文字列を生成します(N:21.8:26.0:...のようなものが必要です)。書式文字列の各要素は、%s
書式の後に続く変数の1つに置き換えられます。
awkは知っておく価値が十分にあります。非常に多様です。