Как я могу отслеживать уровень и частоту беспроводного сигнала и регистрировать его в формате 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
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
с буквальной запятой между ними