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

8

Eu quero executar o comando iw dev wlan0 link continuamente a cada segundo e salvar a saída em um arquivo csv .

Estou usando o seguinte comando:

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

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

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

Eu quero que a saída seja salva de uma forma em que os dois campos sejam separados por vírgula (para que eles sejam exibidos em colunas separadas em editores como o MS Excel) e cada um deles seja executado em uma nova linha. O log.csv deve ficar assim (Você pode ignorar os rótulos, eles são apenas para explicação):

Signal  Frequency
-41     2412
-42     2412
-45     2412
-43     2412
    
por engrasifkhan 26.11.2017 / 14:51

1 resposta

10

Ao executar iw help , você vê um aviso:

  

As telas não não codificam essa ferramenta, não consideramos sua saída estável.

Existem duas seções abaixo: Primeiro, uma solução para o seu problema, evitando iw e, em segundo lugar, uma resposta à sua pergunta. Ambos trabalham com o tradicional awk , bem como (o padrão) GNU Awk .

Solução para o seu problema

Eu usaria iwconfig em vez de iw :

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

Saída

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

Notas

Fiquei confuso se você deseja que os valores sejam separados por , ou melhor, uma tabulação (que seria \t ), escolhi , sem e espaços adjacentes aqui. Se não é isso que você queria, basta alterar s","f de acordo, s é o valor Signal e f o Frequency .
Eu também mudei o redirecionamento, assim o arquivo não precisa ser aberto em cada execução, mas apenas uma vez.

Explicações da awk part

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

Responda à sua pergunta

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

Saída

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

Explicações da awk part

  • /freq/{f=} - na (s) linha (s) com freq , salve a segunda coluna (separada por espaços) na variável f
  • /signal/{s=} - na (s) linha (s) com signal , salve a segunda coluna na variável s
  • END{print s","f} - depois de processar a entrada, print as variáveis s e f com uma vírgula literal entre elas
por dessert 26.11.2017 / 15:01