Как я могу контролировать уровень и частоту беспроводного сигнала и записывать его в формате 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), и каждый из них запускается в новую строку. [F7] будет выглядеть так (вы можете игнорировать метки, они только для объяснения):

Signal Frequency -41 2412 -42 2412 -45 2412 -43 2412
8
задан 27 November 2017 в 00:02

3 ответа

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

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

Ниже приведены два раздела: сначала решение вашей проблемы, избегая iw, а затем ответ на ваш вопрос.

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

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

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

Примечания

Я смутился, хотите ли вы, чтобы значения были разделены , или, скорее, вкладка (которая была бы [ f12]), я выбрал , без и окружающих пространств здесь. Если это не то, что вы хотели, просто измените s","f соответственно, s - это Signal и f значение Frequency. Я также переместил перенаправление, таким образом, файл не нужно открывать в каждом прогоне, но только один раз.

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

-F'[ :=]+' - устанавливает другой разделитель полей, здесь к одному или нескольким (+) из трех символов, заключенных в квадратные скобки /Freq/{gsub("\\.","");f=$5} - в строке с «Freq», заменить каждую точку ничем (поскольку частота в [ f23] использует точку в качестве разделителя тысяч) и сохраните содержимое пятого столбца в переменной 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

-F'[ :=]+' - задает другой разделитель поля, здесь один или несколько (+) трех символы, заключенные в квадратные скобки /signal/{s=$2} - в строке (-ах) с signal, сохраните s econd column в переменной s /Freq/{gsub("\\.","");f=$5} - в строке (-ах) с «Freq», замените каждую точку ничем (поскольку частота на выходе iwconfig использует точку в качестве разделителя тысяч) и сохраните содержимое пятого столбца в переменной f
10
ответ дан 22 May 2018 в 15:53

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

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

Ниже приведены два раздела: сначала решение вашей проблемы, избегая iw, а затем ответ на ваш вопрос.

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

Я использовал бы iwconfig вместо iw: [ ! d7] 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

-F'[ :=]+' - задает другой разделитель поля, здесь один или несколько (+) трех символы, заключенные в квадратные скобки /signal/{s=$2} - в строке (-ах) с signal, сохраните s econd column в переменной s /Freq/{gsub("\\.","");f=$5} - в строке (-ах) с «Freq», замените каждую точку ничем (поскольку частота на выходе iwconfig использует точку в качестве разделителя тысяч) и сохраните содержимое пятого столбца в переменной f
10
ответ дан 18 July 2018 в 02:33

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

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

Ниже приведены два раздела: сначала решение вашей проблемы, избегая iw, а затем ответ на ваш вопрос.

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

Я использовал бы iwconfig вместо iw: [ ! d7] 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

-F'[ :=]+' - задает другой разделитель поля, здесь один или несколько (+) трех символы, заключенные в квадратные скобки /signal/{s=$2} - в строке (-ах) с signal, сохраните s econd column в переменной s /Freq/{gsub("\\.","");f=$5} - в строке (-ах) с «Freq», замените каждую точку ничем (поскольку частота на выходе iwconfig использует точку в качестве разделителя тысяч) и сохраните содержимое пятого столбца в переменной f
10
ответ дан 24 July 2018 в 17:35

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

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