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

Я хочу запускать команду 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
8
задан 26 November 2017 в 23:02

1 ответ

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

Не не не экранируйте этот инструмент, мы не считаем его вывод стабильным.

Ниже есть два раздела : во-первых, решение вашей проблемы, избегая 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, а f - значение Frequency.
Я также переместил перенаправление, таким образом, файл не нужно открывать при каждом запуске, а только один раз.

Пояснения к части 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 с буквенной запятой между ними
10
ответ дан 26 November 2017 в 23:02

Другие вопросы по тегам:

Похожие вопросы: