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