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