Ao executar, iw helpvocê vê um aviso:
Você não screenscrape esta ferramenta, não consideramos seu estábulo de saída.
Existem duas seções abaixo: Primeiro, solucione o problema iwe, em seguida, responda à sua pergunta. Ambos funcionam tanto com o tradicional awkquanto com (o padrão) GNU Awk.
Solução para o seu problema
Eu usaria em iwconfigvez de iw:
while sleep 1; do
iwconfig wlan0 | awk -F'[ :=]+' '/Freq/{gsub("\\.","");f=$5}/Signal/{s=$7}END{print s","f}'
done >>log.csv
Resultado
$ iwconfig wlan0 | awk -F'[ :=]+' '/Freq/{gsub("\\.","");f=$5}/Signal/{s=$7}END{print s","f}'
-44,2412
Notas
Fiquei confuso se você deseja que os valores sejam separados por ,ou melhor, uma guia (o que seria \t), escolhi ,os espaços sem e ao redor aqui. Se isso não é o que você queria apenas mudar s","fnesse sentido, sé o Signale fo Frequencyvalor lá.
Também mudei o redirecionamento, dessa forma, o arquivo não precisa ser aberto em cada execução, mas apenas uma vez.
Explicações da awkpeça
-F'[ :=]+'- define um delimitador de campo diferente, aqui para um ou mais ( +) dos três caracteres entre colchetes
/Freq/{gsub("\\.","");f=$5}- nas linhas com “Freq”, substitua cada ponto por nada (porque a frequência na iwconfigsaída usa um ponto como separador de milhares) e salve o conteúdo da quinta coluna na variávelf
/Signal/{s=$7} - nas linhas com "Sinal", salve o conteúdo da sétima coluna na variável s
END{print s","f}- depois de processar a entrada, printas variáveis se fcom uma vírgula literal entre elas
Responda a sua pergunta
while sleep 1; do
iw dev wlan0 link | awk '/freq/{f=$2};/signal/{s=$2}END{print s","f}'
done >>log.csv
Resultado
$ iw dev wlan0 link | awk '/freq/{f=$2};/signal/{s=$2}END{print s","f}'
-43,2412
Explicações da awkpeça
/freq/{f=$2}- na (s) linha (s) com freq, salve a segunda coluna (separada por espaço) na variávelf
/signal/{s=$2}- na (s) linha (s) com signal, salve a segunda coluna na variávels
END{print s","f}- depois de processar a entrada, printas variáveis se fcom uma vírgula literal entre elas