Как я могу отслеживать уровень и частоту беспроводного сигнала и регистрировать его в формате CSV?

8

Я хочу выполнять команду iw dev wlan0 linkнепрерывно каждую секунду и сохранить вывод в csvфайл.

Я использую следующую команду:

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

Но вывод сохраняется log.csvследующим образом:

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

Я хочу, чтобы выходные данные были сохранены таким образом, чтобы два поля были разделены запятой (поэтому они будут отображаться в отдельных столбцах в редакторах, таких как MS Excel), и каждое из них будет отображаться в новой строке. Они log.csvдолжны выглядеть следующим образом (Вы можете игнорировать метки, они только для пояснения):

Signal  Frequency
-41     2412
-42     2412
-45     2412
-43     2412
engrasifkhan
источник

Ответы:

10

При запуске iw helpвы видите предупреждение:

Вы не screenscrape этого инструмента, мы не считаем его выходом стабильными.

Ниже приведены два раздела : во-первых, решение вашей проблемы, iwа затем ответ на ваш вопрос. Оба работают как с традиционными, awkтак и (по умолчанию) GNU Awk.

Решение вашей проблемы

Я бы использовал iwconfigвместо iw:

while sleep 1; do
  iwconfig wlan0 | awk -F'[ :=]+' '/Freq/{gsub("\\.","");f=$5}/Signal/{s=$7}END{print s","f}'
done >>log.csv

Вывод

$ iwconfig wlan0 | awk -F'[ :=]+' '/Freq/{gsub("\\.","");f=$5}/Signal/{s=$7}END{print s","f}'
-44,2412

Ноты

Я запутался, хотите ли вы, чтобы значения разделялись ,или, вернее, табуляцией (что было бы \t), я выбрал ,без и окружающие пробелы здесь. Если это не то , что вы хотели просто изменить s","fсоответствующим образом , sэто Signalи значение там. Я также переместил перенаправление, таким образом, файл не нужно открывать при каждом запуске, а только один раз.fFrequency

Пояснения к awkчасти

  • -F'[ :=]+'- устанавливает другой разделитель полей, здесь один или несколько ( +) из трех символов, заключенных в квадратные скобки
  • /Freq/{gsub("\\.","");f=$5}- в строке (-ях) с «Freq» замените каждую точку ничем (поскольку частота на iwconfigвыходе использует точку в качестве разделителя тысяч) и сохраните содержимое пятого столбца в переменнойf
  • /Signal/{s=$7} - в строке (-ях) с «Сигналом» сохранить содержимое седьмого столбца в переменной s
  • END{print s","f}- после обработки ввода, printпеременных sи fс буквальной запятой между ними

Ответ на ваш вопрос

while sleep 1; do
  iw dev wlan0 link | awk '/freq/{f=$2};/signal/{s=$2}END{print s","f}'
done >>log.csv

Вывод

$ iw dev wlan0 link | awk '/freq/{f=$2};/signal/{s=$2}END{print s","f}'
-43,2412

Пояснения к awkчасти

  • /freq/{f=$2}- в строке (-ях) с помощью freqсохранить второй столбец (через пробел) в переменнойf
  • /signal/{s=$2}- в строке (-ях) с помощью signalсохранить второй столбец в переменнойs
  • END{print s","f}- после обработки ввода, printпеременных sи fс буквальной запятой между ними
Десерт
источник