Wie kann ich den drahtlosen Signalpegel und die Frequenz überwachen und im CSV-Format protokollieren?

8

Ich möchte den Befehl iw dev wlan0 linkkontinuierlich jede Sekunde ausführen und die Ausgabe in einer csvDatei speichern.

Ich benutze den folgenden Befehl:

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

Die Ausgabe wird jedoch folgendermaßen gespeichert log.csv:

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

Ich möchte, dass die Ausgabe so gespeichert wird, dass die beiden Felder durch Komma getrennt sind (sodass sie in Editoren wie MS Excel in separaten Spalten angezeigt werden) und jeweils in einer neuen Zeile angezeigt werden. Das log.csvsoll so aussehen (Sie können die Beschriftungen ignorieren, sie dienen nur zur Erklärung):

Signal  Frequency
-41     2412
-42     2412
-45     2412
-43     2412
Engrasifkhan
quelle

Antworten:

10

Beim Laufen sehen iw helpSie eine Warnung:

Sie nicht dieses Tool screenscrape, wir sind nicht der Ansicht sein Ausgang stabil.

Im Folgenden finden Sie zwei Abschnitte : Erstens eine Lösung zur Vermeidung Ihres Problems iwund zweitens eine Antwort auf Ihre Frage. Beide arbeiten sowohl mit traditionell awkals auch (Standardeinstellung) GNU Awk.

Lösung für Ihr Problem

Ich würde iwconfiganstelle von verwenden iw:

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

Ausgabe

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

Anmerkungen

Ich war verwirrt, ob Sie die Werte durch ,oder eher durch eine Registerkarte (was wäre \t) getrennt haben möchten . Ich habe hier ,ohne und umliegende Leerzeichen gewählt. Wenn es nicht das ist, was Sie wollten, ändern Sie es einfach s","fentsprechend, sist das Signalund fder FrequencyWert dort.
Ich habe auch die Umleitung verschoben. Auf diese Weise muss die Datei nicht bei jedem Lauf geöffnet werden, sondern nur einmal.

Erklärungen des awkTeils

  • -F'[ :=]+'- setzt ein anderes Feldtrennzeichen, hier auf eines oder mehrere ( +) der drei Zeichen in eckigen Klammern
  • /Freq/{gsub("\\.","");f=$5}- Ersetzen Sie in den Zeilen mit „Freq“ jeden Punkt durch nichts (da die Frequenz in der iwconfigAusgabe einen Punkt als Tausendertrennzeichen verwendet) und speichern Sie den Inhalt der fünften Spalte in einer Variablenf
  • /Signal/{s=$7} - Speichern Sie in den Zeilen mit „Signal“ den Inhalt der siebten Spalte in einer Variablen s
  • END{print s","f}- nach der Verarbeitung der Eingabe printdie Variablen sund fmit einem wörtlichen Komma dazwischen

Beantworten Sie Ihre Frage

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

Ausgabe

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

Erklärungen des awkTeils

  • /freq/{f=$2}- freqSpeichern Sie in den Zeilen mit die zweite Spalte (durch Leerzeichen getrennt) in der Variablenf
  • /signal/{s=$2}- signalSpeichern Sie in den Zeilen mit die zweite Spalte in der Variablens
  • END{print s","f}- nach der Verarbeitung der Eingabe printdie Variablen sund fmit einem wörtlichen Komma dazwischen
Dessert
quelle