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