Як я можу стежити за рівнем та частотою бездротового сигналу та реєструвати його у форматі csv?


8

Я хочу запускати команду 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

Відповіді:


10

Під час запуску 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з буквальною комою між ними
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.