awk problem

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
CaT
Beiträge: 536
Registriert: 08.05.2003 07:59:46

awk problem

Beitrag von CaT » 26.03.2004 11:21:33

Hi Leute

hoffe es geht euch allen gut hier. ich melde mich auch mal ja :)

also ich hab eine frage zu awk und zwar habe ich folgende situation
aus einem logfile ergibt sich immer folgendes:

name: test1
state: Up
serverID: 2802
load: 39
maxCache: 20000
cached: 12
active: 12
stale: 0
pending: 0
pendingOut: 0
watched: 12

name: test2
state: Up
serverID: 510
load: 6951
maxCache: 100000
cached: 21212
active: 21212
stale: 0
pending: 0
pendingOut: 0
watched: 21212

nun muss ich immer dass watched haben .. ABER nur das watched von test2 und nicht das von test1 das scirpt sollte aber so flexibel sein, dass wenn jetzt z.b. noch ein test3 hinzukommt, dass es dann trotdzem noch funktioniert.
grüsse
CaT

fluid
Beiträge: 494
Registriert: 14.11.2003 21:52:49

Beitrag von fluid » 26.03.2004 12:21:24

So, das sollte immer den watched-Wert von dem zweiten Eintrag ausgeben. Wenn du es so willst, das immer der watched-Wert vom letzten Eintrag ausgegeben wird (war aus deinem Posting nicht ersichtlich), dann musst du den head-Teil weglassen.

Code: Alles auswählen

echo `cat deinelogdatei.log | grep ^watched: | head -n 2 | tail -n 1| cut -f 2 -d " "`
Edit:
Hmm ich glaub ich hab nicht richtig gelesen, sorry :(
Aber ich lass das einfach mal hier drin, vielleicht bringts ja noch jemandem was.
Zuletzt geändert von fluid am 26.03.2004 12:24:54, insgesamt 1-mal geändert.

Benutzeravatar
Joghurt
Beiträge: 5244
Registriert: 30.01.2003 15:27:31
Wohnort: Hamburg
Kontaktdaten:

Beitrag von Joghurt » 26.03.2004 12:21:43

Code: Alles auswählen

sed -ne '/^name: test2$/,/^$/p' datei
gibt nur den Bereich aus, der mit "name: test2" beginnt und mit einer Leerzeile endet.

Edit: wenn du wirklich nur den watched-Teil sehen willst, mach folgendes:

Code: Alles auswählen

sed -ne'/^name: test2$/,/^$/ {/^watched:/p}' datei

Benutzeravatar
CaT
Beiträge: 536
Registriert: 08.05.2003 07:59:46

Beitrag von CaT » 26.03.2004 12:59:29

danke für die tipps. die lösung mit sed tönt gut. aber ich hab mich ein wenig falsch ausgedrückt das is kein file sondern ein output ... ich müsste das also mit ner pipe anhängen. geth das so ? oder muss ich das anders machen ?
wenn ich deine zeile einfach nach ne pipe hänge kommt das:

sed: command garbled: /^name: test2$/,/^$/ {/^watched:/p}
sed: command garbled: /^name: test2$/,/^$/ {/^watched:/p}

grüsse
Zuletzt geändert von CaT am 26.03.2004 13:05:47, insgesamt 1-mal geändert.

Benutzeravatar
Joghurt
Beiträge: 5244
Registriert: 30.01.2003 15:27:31
Wohnort: Hamburg
Kontaktdaten:

Beitrag von Joghurt » 26.03.2004 13:03:08

Code: Alles auswählen

programm | sed -ne '...'
geht auch

Benutzeravatar
CaT
Beiträge: 536
Registriert: 08.05.2003 07:59:46

Beitrag von CaT » 26.03.2004 13:07:09

nö eben leider net (siehe oben)

Benutzeravatar
Joghurt
Beiträge: 5244
Registriert: 30.01.2003 15:27:31
Wohnort: Hamburg
Kontaktdaten:

Beitrag von Joghurt » 26.03.2004 13:12:16

Seltsam.

Code: Alles auswählen

cat b | sed -ne '/^name: test2$/,/^$/ {/^watched:/p}'
funktioniert bei mir. Was sagt denn "sed --version"
Geht es denn, wenn du meinen ersten Vorschlag als Befehl nimmst (also nur "p" statt "{/....../p}")?

Benutzeravatar
CaT
Beiträge: 536
Registriert: 08.05.2003 07:59:46

Beitrag von CaT » 26.03.2004 13:32:12

nö mit dem ersten befehl geht es auch nicth ....
sed --version geht net.
ich hab das prob auf nem system das unter solaris (2.5.6) läuft also wird es sicherlich eine ältere version sein.
Zuletzt geändert von CaT am 26.03.2004 13:38:33, insgesamt 1-mal geändert.

Benutzeravatar
pdreker
Beiträge: 8298
Registriert: 29.07.2002 21:53:30
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Nürnberg

Beitrag von pdreker » 26.03.2004 13:36:51

Das wird entweder eine ältere Version von sed sein, oder (noch schlimmer) nicht die GNU Version von sed, sondern eine Sun eigene Lösung. Die hat weniger Features und ist nicht POSIX vollständig soweit ich weiss...

Patrick
Definitely not a bot...
Jabber: pdreker@debianforum.de

Benutzeravatar
CaT
Beiträge: 536
Registriert: 08.05.2003 07:59:46

Beitrag von CaT » 26.03.2004 13:39:11

hi

ou das is aber ziemlich sch**sse ... sonstige möglichkeiten ???

Benutzeravatar
pdreker
Beiträge: 8298
Registriert: 29.07.2002 21:53:30
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Nürnberg

Beitrag von pdreker » 26.03.2004 13:52:29

GNU sed von http://www.gnu.org runterladen und in /usr/local/ installieren... Evtl. darauf achten, dass es nicht als "sed" sondern als "gsed" installiert wird, weil sich einige Solaris Skripte auf das Verhalten Ihres eigenen sed verlassen...

Patrick
Definitely not a bot...
Jabber: pdreker@debianforum.de

Benutzeravatar
Joghurt
Beiträge: 5244
Registriert: 30.01.2003 15:27:31
Wohnort: Hamburg
Kontaktdaten:

Beitrag von Joghurt » 26.03.2004 14:36:06

Perl geht auch:

Code: Alles auswählen

perl -ne '$p=1 if /^name: test2$/;$p=0 if /^$/;print if $p;'
oder

Code: Alles auswählen

perl -ne '$p=1 if /^name: test2$/;$p=0 if /^$/;print if $p and /^watched/;'
um nur die watched-Zeile zu haben. Wenn du bei mehreren Ausgaben die Leerzeile dazwischen behalten willst, musst du den '$p=0 if...'-Befehl einfach ganz ans Ende packen

Antworten