Cuando corres iw helpves una advertencia:
No , no screenscrape esta herramienta, no consideramos su salida estable.
Hay dos secciones a continuación: Primero, una solución para evitar su problema iwy, en segundo lugar, una respuesta a su pregunta. Ambos funcionan tanto con tradicional awkcomo con (el predeterminado) GNU Awk.
Solución a tu problema
Yo usaría en iwconfiglugar de iw:
while sleep 1; do
iwconfig wlan0 | awk -F'[ :=]+' '/Freq/{gsub("\\.","");f=$5}/Signal/{s=$7}END{print s","f}'
done >>log.csv
Salida
$ iwconfig wlan0 | awk -F'[ :=]+' '/Freq/{gsub("\\.","");f=$5}/Signal/{s=$7}END{print s","f}'
-44,2412
Notas
Me confundí si desea que los valores estén separados por ,o más bien una pestaña (que sería \t), elegí ,sin espacios circundantes aquí. Si eso no es lo que quería acaba de cambiar s","fen consecuencia, ses el Signaly fel Frequencyvalor allí.
También moví la redirección, de esta manera el archivo no tiene que abrirse en cada ejecución, sino solo una vez.
Explicaciones de la awkparte.
-F'[ :=]+'- establece un delimitador de campo diferente, aquí para uno o más ( +) de los tres caracteres encerrados entre corchetes
/Freq/{gsub("\\.","");f=$5}- en la (s) línea (s) con "Freq", reemplace cada punto por nada (porque la frecuencia en la iwconfigsalida usa un punto como separador de miles) y guarde el contenido de la quinta columna en variablef
/Signal/{s=$7} - en la (s) línea (s) con "Señal", guarde el contenido de la séptima columna en variable s
END{print s","f}- después de procesar la entrada, printlas variables sy fcon una coma literal entre ellas
Responde a tu pregunta
while sleep 1; do
iw dev wlan0 link | awk '/freq/{f=$2};/signal/{s=$2}END{print s","f}'
done >>log.csv
Salida
$ iw dev wlan0 link | awk '/freq/{f=$2};/signal/{s=$2}END{print s","f}'
-43,2412
Explicaciones de la awkparte.
/freq/{f=$2}- en la (s) línea (s) con freq, guarde la segunda columna (espacio separado) en variablef
/signal/{s=$2}- en la (s) línea (s) con signal, guarde la segunda columna en variables
END{print s","f}- después de procesar la entrada, printlas variables sy fcon una coma literal entre ellas