Cuando corres iw help
ves 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 iw
y, en segundo lugar, una respuesta a su pregunta. Ambos funcionan tanto con tradicional awk
como con (el predeterminado) GNU Awk
.
Solución a tu problema
Yo usaría en iwconfig
lugar 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","f
en consecuencia, s
es el Signal
y f
el Frequency
valor 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 awk
parte.
-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 iwconfig
salida 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, print
las variables s
y f
con 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 awk
parte.
/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, print
las variables s
y f
con una coma literal entre ellas