Jak mogę monitorować poziom i częstotliwość sygnału bezprzewodowego i rejestrować go w formacie csv?

8

Chcę uruchamiać polecenie iw dev wlan0 linknieprzerwanie co sekundę i zapisywać dane wyjściowe w csvpliku.

Używam następującego polecenia:

while sleep 1; do
  iw dev wlan0 link | grep 'freq:\|signal' | awk '{printf "%s ", $2, $3}' >> log.csv
done

Ale dane wyjściowe są zapisywane w log.csvnastępujący sposób:

2412 -41 2412 -42 2412 -45 2412 -43

Chcę, aby dane wyjściowe zostały zapisane w sposób, w którym dwa pola są oddzielone przecinkiem (więc będą wyświetlane w osobnych kolumnach w edytorach, takich jak MS Excel), a każde z nich przejdzie do nowej linii. log.csvPowinien wyglądać następująco (Można zignorować etykiet, są one jedynie przykładowe):

Signal  Frequency
-41     2412
-42     2412
-45     2412
-43     2412
engrasifkhan
źródło

Odpowiedzi:

10

Podczas uruchamiania iw helppojawia się ostrzeżenie:

Czy nie screen tego narzędzia, nie uważamy jej stabilny sygnał wyjściowy.

Poniżej znajdują się dwie sekcje : po pierwsze rozwiązanie problemu pozwalającego uniknąć problemu, iwa następnie odpowiedź na pytanie. Oba działają zarówno z tradycyjnym, awkjak i (domyślnym) GNU Awk.

Rozwiązanie twojego problemu

Użyłbym iwconfigzamiast iw:

while sleep 1; do
  iwconfig wlan0 | awk -F'[ :=]+' '/Freq/{gsub("\\.","");f=$5}/Signal/{s=$7}END{print s","f}'
done >>log.csv

Wynik

$ iwconfig wlan0 | awk -F'[ :=]+' '/Freq/{gsub("\\.","");f=$5}/Signal/{s=$7}END{print s","f}'
-44,2412

Notatki

Byłem zdezorientowany, czy chcesz, aby wartości były oddzielone, ,czy raczej tabulatorem (który byłby \t), wybrałem tutaj ,bez i otaczających spacji tutaj. Jeśli nie jest to, co chciał po prostu zmienić s","fodpowiednio, sjest Signali wartość tam. Przeniesiłem również przekierowanie, w ten sposób plik nie musi być otwierany przy każdym uruchomieniu, ale tylko raz.fFrequency

Objaśnienia awkczęści

  • -F'[ :=]+'- ustawia inny ogranicznik pola, tutaj na jeden lub więcej ( +) z trzech znaków zawartych w nawiasach kwadratowych
  • /Freq/{gsub("\\.","");f=$5}- w wierszu (wierszach) „Freq” zamień każdą kropkę na nic (ponieważ częstotliwość na iwconfigwyjściu używa kropki jako separatora tysięcy) i zapisz zawartość piątej kolumny w zmiennejf
  • /Signal/{s=$7} - w wierszu (wierszach) z „Signal”, zapisz zawartość siódmej kolumny w zmiennej s
  • END{print s","f}- po przetworzeniu danych wejściowych printzmienne si fdosłowny przecinek między nimi

Odpowiedz na swoje pytanie

while sleep 1; do
  iw dev wlan0 link | awk '/freq/{f=$2};/signal/{s=$2}END{print s","f}'
done >>log.csv

Wynik

$ iw dev wlan0 link | awk '/freq/{f=$2};/signal/{s=$2}END{print s","f}'
-43,2412

Objaśnienia awkczęści

  • /freq/{f=$2}- w wierszu (wierszach) za pomocą freq, zapisz drugą kolumnę (oddzieloną spacją) w zmiennejf
  • /signal/{s=$2}- w wierszu (wierszach) signal, zapisz drugą kolumnę w zmiennejs
  • END{print s","f}- po przetworzeniu danych wejściowych printzmienne si fdosłowny przecinek między nimi
deser
źródło