如何监视无线信号的电平和频率并将其记录为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

我希望以两种方式用逗号分隔输出的方式保存输出(因此它们将显示在MS Excel等编辑器的单独列中),并且每行都换一个新行。的log.csv外观如下(您可以忽略标签,它们仅用于解释):

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

Answers:


10

运行时,iw help您会看到警告:

难道不是屏幕抓取这个工具,我们不考虑它的输出稳定。

以下分为两部分:第一,避免问题的解决方案iw,第二,对问题的解答。两者都适用于传统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,然后sSignal和那里fFrequency值。
我还移动了重定向,因此不必每次运行都打开文件,而只需打开一次。

awk零件说明

  • -F'[ :=]+'–设置一个不同的字段定界符,此处设置为+方括号内的三个字符中的一个或多个()
  • /Freq/{gsub("\\.","");f=$5}–在带有“ Freq”的行中,将所有点都替换为空(因为iwconfig输出中的频率使用点作为千位分隔符),并将第五列的内容保存在变量中f
  • /Signal/{s=$7} –在带有“信号”的行中,将第七列的内容保存在变量中 s
  • END{print s","f}-处理所述输入,之后print的变量sf在它们之间具有字面逗号

回答你的问题

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,将第二列(以空格分隔)保存在变量中f
  • /signal/{s=$2}–在带有的行中signal,将第二列保存在变量中s
  • END{print s","f}-处理所述输入,之后print的变量sf在它们之间具有字面逗号
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.