Dump mit grep/sed/awk auswerten?

Gast #4693441
Hallo!

ich möchte mir gerne für RRD die Werte der Zeilen channel busy time, 
receive time und transmit time aus dem Block [in use] mit grep, sed 
und/oder awk extrahieren. Leider sind meine Kenntnisse mit diesem Tools 
für solche Vorhaben nicht ausreichend. Hat mir jemand einen Tipp oder 
einen Link auf ein ähnliches Skript welches ich dann für meine Zwecke 
umbauen kann?

Besten Dank schonmal :)
1
Survey data from wlan1
2
        frequency:                      2432 MHz [in use]
3
        noise:                          -95 dBm
4
        channel active time:            73621132 ms
5
        channel busy time:              14259516 ms
6
        channel receive time:           12026978 ms
7
        channel transmit time:          1249821 ms
8
Survey data from wlan1
9
        frequency:                      2437 MHz
10
        noise:                          -95 dBm
11
        channel active time:            59 ms
12
        channel busy time:              16 ms
13
        channel receive time:           14 ms
14
        channel transmit time:          1 ms
15
Survey data from wlan1
16
        frequency:                      2442 MHz
17
        noise:                          -95 dBm
18
        channel active time:            59 ms
19
        channel busy time:              18 ms
20
        channel receive time:           16 ms
21
        channel transmit time:          1 ms
Regel Nr. 1: Wenn man awk verwendet braucht man weder sed noch grep. 
Beides kann awk genauso gut.

Ohne es ausprobiert zu haben (und lange nicht mehr gemacht), das 
awk-Programm:
1
/channel busy time:/     { print $4 $5; next; } 
2
/channel receive time:/  { print $4 $5; next; } 
3
/channel transmit time:/ { print $4 $5; next; }
Gast
Liz schrieb:
> Being survey fehlen die slashes. Wie geht days dass die angezeigt
> werden?

Da hat wohl irgendeine Rechtschreibkorrektur zugeschlagen :)

Aber zur Frage. Direkt über dem Eingabefeld dieses Forums gibt es 
Hinweise zur Formatierung. Dann klappts auch mit den Slashes.
Gast
Das Beispiel oben ist die Ausgabe von
$ iw reg wlan0 survey dump

Benötigt werden in einen Shell-Skript die 3 Werte busy, receive, 
transmit time um diese an rrdupdate zu übergeben. Je WLAN-Kanal wird ein 
Block ausgegeben, aber mich interessiert nur der, der in der Ausgabe mit 
[in use] gekennzeichnet ist.
Gast
[code]
Survey { active = $NF ; ok = 0; }
Index($0,"[in use]") { ok++; found++;}
! ok { next;}

/channel busy time:/     { busy=$4; }
/channel receive time:/  { receive=$4; }
/channel transmit time:/ { transmit=$4; }

END { if ( found ) print active, busy, receive, transmit; }
[code]
Gast
1
/Survey/ { active = $NF ; ok = 0; }
2
Index($0,"[in use]") { ok++; found++;}
3
! ok { next;}
4

5
/channel busy time:/     { busy=$4; } 
6
/channel receive time:/  { receive=$4; } 
7
/channel transmit time:/ { transmit=$4; } 
8

9
END { if ( found ) print active, busy, receive, transmit; }
Gast
Wenn man davon ausgehen kann (bitte nachprüfen!), dass in der Ausgabe 
der fragliche [in use]-Block immer als erstes erscheint, könnte man 
auch einfach eine Kombination von grep und head benutzen:

1
... | grep -E 'channel (busy|receive|transmit) time:' | head -n 3


Eine Alternative, wenn man sich darauf nicht verlassen kann, wäre,
zunächst nach der Zeile mit dem [in use] zu suchen und dann die
5 darauf folgenden Zeilen heraus zu filtern:

1
... | grep -A5 '\[in use\]' | grep -E 'channel (busy|receive|transmit) time:'
Gast
Danke für die zahlreichen Hinweise! Einen Dump habe ich mal angehängt.
1
$ iw wlan1 survey dump | | grep -A5 '\[in use\]' | grep -E 'channel (busy|receive|transmit) time:'

ergibt schonmal eine Zwischenausgabe aus der ich die Zahlen bestimmt 
noch extrahiert bekomme.

Die AWK-Beispiele bekomme ich leider nicht zum laufen, glaub bin für AWK 
zu doof. Hab den Code von Liz in test.awk kopiert.
1
$ iw wlan1 survey dump | awk -f test.awk
Angehängte Dateien:
Gast
Dann verwende noch dies
| tr '\n' ' '

Es ist ein Leerzeichen zwischen den zweiten  '
Es generiert dann nur eine Zeile

Und mit
l awk '{ print $4,$9,$14 ;}'
Werden dann die Zahlen extrahiert.
Nummern muessen eventuell angepasst werden.
Es ist die Nummer des Wortes, angefangen mit 1

Wegen awk , eventuell gibt ed Probleme mit utf und ASCII,
Passiert mir auch öfters beim kopieren von code aus Website.
Gast
1
$ iw wlan1 survey dump | awk -f test.awk

ergibt
1
awk: test.awk:2: Call to undefined function

test.awk:
1
/Survey/ { active = $NF ; ok = 0; }
2
Index($0,"[in use]") { ok++; found++;}
3
! ok { next;}
4

5
/channel busy time:/     { busy=$4; }
6
/channel receive time:/  { receive=$4; }
7
/channel transmit time:/ { transmit=$4; }
8

9
END { if ( found ) print active, busy, receive, transmit; }

Gibt es eigentlich ein gutes Howto zu awk & co? Ich benutz das zu selten 
als dass ich da ansatzweise weiß was zu tun ist :-(
Gast
1
/Survey/ { active = $NF ; ok = 0; }
2
Index($0,"[in use]") { ok++; found++;}
3
! ok { next;}
4

5
Sollte eigentlich so sein
6

7
/Survey/ { a = $NF ; ok = 0; }
8
Index($0,"[in use]") { ok++; found++; active=a;}
9
! ok { next;}

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 10 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.