¿Cómo puedo monitorear el nivel y la frecuencia de la señal inalámbrica y registrarlo en formato csv?

8

Quiero ejecutar el comando iw dev wlan0 linkcontinuamente cada segundo y guardar la salida en un csvarchivo.

Estoy usando el siguiente comando:

while sleep 1; do
  iw dev wlan0 link | grep 'freq:\|signal' | awk '{printf "%s ", $2, $3}' >> log.csv
done

Pero la salida se guarda log.csvde la siguiente manera:

2412 -41 2412 -42 2412 -45 2412 -43

Quiero que la salida se guarde de manera que los dos campos estén separados por comas (para que se muestren en columnas separadas en editores como MS Excel) y cada uno se ejecute en una nueva línea. El log.csvdeberá tener este aspecto (Puede ignorar las etiquetas, que son ejemplos):

Signal  Frequency
-41     2412
-42     2412
-45     2412
-43     2412
engrasifkhan
fuente

Respuestas:

10

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
postre
fuente