ワイヤレス信号のレベルと周波数を監視してcsv形式で記録するにはどうすればよいですか?


8

コマンドをiw dev wlan0 link毎秒継続的に実行し、出力をcsvファイルに保存したい。

次のコマンドを使用しています。

while sleep 1; do
  iw dev wlan0 link | grep 'freq:\|signal' | awk '{printf "%s ", $2, $3}' >> log.csv
done

ただし、出力はlog.csv次の方法で保存されます。

2412 -41 2412 -42 2412 -45 2412 -43

2つのフィールドをカンマで区切って(MS Excelなどのエディターで別の列に表示されるように)出力を保存し、それぞれを新しい行に入れたいのですが。log.csv(あなたは、彼らが唯一の説明のためのもので、ラベルを無視することができます)このように見えるもの:

Signal  Frequency
-41     2412
-42     2412
-45     2412
-43     2412

回答:


10

実行iw helpすると警告が表示されます:

このツールをスクリーンスクレイピングしないでください。出力が安定しているとは見なされません。

以下の2つのセクションがあります。1つは問題を回避するための解決策iw、2つ目は質問への回答です。どちらも従来型awk(デフォルト)で動作しGNU Awkます。

あなたの問題の解決策

私はiwconfig代わりに使用しますiw

while sleep 1; do
  iwconfig wlan0 | awk -F'[ :=]+' '/Freq/{gsub("\\.","");f=$5}/Signal/{s=$7}END{print s","f}'
done >>log.csv

出力

$ iwconfig wlan0 | awk -F'[ :=]+' '/Freq/{gsub("\\.","");f=$5}/Signal/{s=$7}END{print s","f}'
-44,2412

ノート

私はあなたが値を区切っかどうかを混同してしまった,(だろうタブいうか\t)、私が選んだ,せずに、ここでスペースを囲みます。それはあなただけの変更望んでない場合はs","fそれに応じて、sあるSignalと価値があります。 また、リダイレクトを移動しました。この方法では、実行のたびにファイルを開く必要はなく、一度だけ開く必要があります。fFrequency

awkパーツの説明

  • -F'[ :=]+'–別のフィールド区切り文字を、ここ+では角括弧で囲まれた3文字のうちの1つ以上()に設定します
  • /Freq/{gsub("\\.","");f=$5}–「Freq」の行で、すべてのドットを何も置き換えないでください(iwconfig出力の頻度はドットを3桁ごとの区切り記号として使用するため)。5番目の列の内容を変数に保存します。f
  • /Signal/{s=$7} –「Signal」の行で、7番目の列の内容を変数に保存します s
  • END{print s","f}–入力を処理した後print、変数sおよびfそれらの間のリテラルコンマ

あなたの質問に答える

while sleep 1; do
  iw dev wlan0 link | awk '/freq/{f=$2};/signal/{s=$2}END{print s","f}'
done >>log.csv

出力

$ iw dev wlan0 link | awk '/freq/{f=$2};/signal/{s=$2}END{print s","f}'
-43,2412

awkパーツの説明

  • /freq/{f=$2}–のある行でfreq、2番目の列(スペースで区切られている)を変数に保存しますf
  • /signal/{s=$2}–のある行でsignal、2番目の列を変数に保存しますs
  • END{print s","f}–入力を処理した後print、変数sおよびfそれらの間のリテラルコンマ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.