実行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
と価値があります。
また、リダイレクトを移動しました。この方法では、実行のたびにファイルを開く必要はなく、一度だけ開く必要があります。f
Frequency
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
それらの間のリテラルコンマ