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ídaiwconfigusa um ponto como separador de milhar) e salve o conteúdo da quinta coluna na variávelf -
/Signal/{s=}- na (s) linha (s) com “Sinal”, salve o conteúdo da sétima coluna na variávels -
END{print s","f}- depois de processar a entrada,printas variáveissefcom 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) comfreq, salve a segunda coluna (separada por espaços) na variávelf -
/signal/{s=}- na (s) linha (s) comsignal, salve a segunda coluna na variávels -
END{print s","f}- depois de processar a entrada,printas variáveissefcom uma vírgula literal entre elas