Como posso monitorar o nível e a frequência do sinal sem fio e registrá-lo no formato csv?

8

Quero executar o comando iw dev wlan0 linkcontinuamente a cada segundo e salvar a saída em um csvarquivo.

Estou usando o seguinte comando:

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

Mas a saída é salva log.csvda seguinte maneira:

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

Quero que a saída seja salva de uma maneira em que os dois campos sejam separados por vírgula (para que sejam exibidos em colunas separadas em editores como o MS Excel) e cada um deles seja executado em uma nova linha. A log.csvaparência deve ser a seguinte (você pode ignorar os rótulos, eles servem apenas como explicação):

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

Respostas:

10

Ao executar, iw helpvocê vê um aviso:

Você não screenscrape esta ferramenta, não consideramos seu estábulo de saída.

Existem duas seções abaixo: Primeiro, solucione o problema iwe, em seguida, responda à sua pergunta. Ambos funcionam tanto com o tradicional awkquanto com (o padrão) GNU Awk.

Solução para o seu problema

Eu usaria em iwconfigvez de iw:

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

Resultado

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

Notas

Fiquei confuso se você deseja que os valores sejam separados por ,ou melhor, uma guia (o que seria \t), escolhi ,os espaços sem e ao redor aqui. Se isso não é o que você queria apenas mudar s","fnesse sentido, sé o Signale fo Frequencyvalor lá.
Também mudei o redirecionamento, dessa forma, o arquivo não precisa ser aberto em cada execução, mas apenas uma vez.

Explicações da awkpeça

  • -F'[ :=]+'- define um delimitador de campo diferente, aqui para um ou mais ( +) dos três caracteres entre colchetes
  • /Freq/{gsub("\\.","");f=$5}- nas linhas com “Freq”, substitua cada ponto por nada (porque a frequência na iwconfigsaída usa um ponto como separador de milhares) e salve o conteúdo da quinta coluna na variávelf
  • /Signal/{s=$7} - nas linhas com "Sinal", salve o conteúdo da sétima coluna na variável s
  • END{print s","f}- depois de processar a entrada, printas variáveis se fcom uma vírgula literal entre elas

Responda a sua pergunta

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

Resultado

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

Explicações da awkpeça

  • /freq/{f=$2}- na (s) linha (s) com freq, salve a segunda coluna (separada por espaço) na variávelf
  • /signal/{s=$2}- na (s) linha (s) com signal, salve a segunda coluna na variávels
  • END{print s","f}- depois de processar a entrada, printas variáveis se fcom uma vírgula literal entre elas
sobremesa
fonte