Come posso monitorare il livello e la frequenza del segnale wireless e registrarlo in formato CSV?


8

Voglio eseguire il comando iw dev wlan0 linkcontinuamente ogni secondo e salvare l'output in un csvfile.

Sto usando il seguente comando:

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

Ma l'output viene salvato nel log.csvmodo seguente:

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

Voglio che l'output venga salvato in un modo in cui i due campi sono separati da una virgola (quindi verranno visualizzati in colonne separate in editor come MS Excel) e ciascuno verrà eseguito in una nuova riga. La log.csvdeve assomigliare a questo (È possibile ignorare le etichette, sono solo per la spiegazione):

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

Risposte:


10

Durante l'esecuzione viene iw helpvisualizzato un avviso:

Do Non screenscrape questo strumento, non consideriamo la sua uscita stabile.

Di seguito sono riportate due sezioni : in primo luogo una soluzione al problema da evitare iwe in secondo luogo una risposta alla domanda. Entrambi funzionano con sia tradizionali awkche (impostazione predefinita) GNU Awk.

Soluzione al tuo problema

Userei iwconfiginvece di iw:

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

Produzione

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

Appunti

Mi sono confuso se vuoi che i valori siano separati da ,o piuttosto una scheda (che sarebbe \t), ho scelto ,senza e spazi circostanti qui. Se questo non è quello che si voleva solo cambiare s","fdi conseguenza, sè il Signale fil Frequencyvalore di lì.
Ho anche spostato il reindirizzamento, in questo modo il file non deve essere aperto ad ogni esecuzione ma solo una volta.

Spiegazioni della awkparte

  • -F'[ :=]+'- imposta un delimitatore di campo diverso, qui su uno o più ( +) dei tre caratteri racchiusi tra parentesi quadre
  • /Freq/{gsub("\\.","");f=$5}- nelle righe con "Freq", sostituisci ogni punto con nulla (perché la frequenza iwconfignell'output utilizza un punto come separatore delle migliaia) e salva il contenuto della quinta colonna in variabilef
  • /Signal/{s=$7} - nelle righe con "Signal", salva il contenuto della settima colonna in variabile s
  • END{print s","f}- dopo aver elaborato l'input, printle variabili se fcon una virgola letterale tra loro

Rispondi alla tua domanda

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

Produzione

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

Spiegazioni della awkparte

  • /freq/{f=$2}- nelle righe con freq, salva la seconda colonna (spazio separato) in variabilef
  • /signal/{s=$2}- nelle righe con signal, salva la seconda colonna in variabiles
  • END{print s","f}- dopo aver elaborato l'input, printle variabili se fcon una virgola letterale tra loro
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.