Durante l'esecuzione viene iw help
visualizzato 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 iw
e in secondo luogo una risposta alla domanda. Entrambi funzionano con sia tradizionali awk
che (impostazione predefinita) GNU Awk
.
Soluzione al tuo problema
Userei iwconfig
invece 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","f
di conseguenza, s
è il Signal
e f
il Frequency
valore 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 awk
parte
-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 iwconfig
nell'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, print
le variabili s
e f
con 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 awk
parte
/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, print
le variabili s
e f
con una virgola letterale tra loro