Forum: PC-Programmierung Dump mit grep/sed/awk auswerten?


von Gerald K. (Gast)


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

von Liz (Gast)


Lesenswert?

Was ist das endformat was benötigt wird.

von Hannes J. (Firma: _⌨_) (pnuebergang)


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; }

: Bearbeitet durch User
von Liz (Gast)


Lesenswert?

Survey { active = $NF ; ok = 0; }
Index($0,"[in use]")  { ok++;}
! ok { next;}

Setze diesel Zeilen favor.

von Liz (Gast)


Lesenswert?

Being survey fehlen die slashes. Wie geht days dass die angezeigt 
werden?

von guest (Gast)


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.

von Gerald K. (Gast)


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.

von Liz (Gast)


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]

von Liz (Gast)


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; }

von Rene H. (Gast)


Lesenswert?

Häng doch mal eine Ausgabe Datei an. Dann kann man es vor dem Posten 
kurz testen.

Grüsse,
René

von grepping my head (Gast)


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:'

von Gerald K. (Gast)


Angehängte Dateien:

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

von Liz (Gast)


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.

von Gerald K. (Gast)


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 :-(

von Liz (Gast)


Lesenswert?

Index muss kleingeschrieben sein.

von Gerald K. (Gast)


Lesenswert?

Super, funktioniert!

Vielen, vielen Dank :-)

Ich schnapp mir jetzt ein awk-Handbuch und versuche das Skript zu 
verstehen

von Liz (Gast)


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;}

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.