Dump mit grep/sed/awk auswerten?

Gast #4693441
Lesenswert?
• ▲
▼
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
#4693450
Lesenswert?
• ▲
▼
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 #4693470
Lesenswert?
• ▲
▼
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 #4693477
Lesenswert?
• ▲
▼
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 #4693568
Lesenswert?
• ▲
▼
[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 #4693569
Lesenswert?
• ▲
▼
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 #4694220
Lesenswert?
• ▲
▼
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 #4694688
Lesenswert?
• ▲
▼
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 #4694767
Lesenswert?
• ▲
▼
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 #4694789
Lesenswert?
• ▲
▼
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 #4694931
Lesenswert?
• ▲
▼
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren