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