awk-Skript: ab pattern best. Anzahl Zeilen printen [gelöst]

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

awk-Skript: ab pattern best. Anzahl Zeilen printen [gelöst]

Beitrag von Duff » 21.06.2007 15:41:55

Hallo,

habe mal wieder ein Problem mit einem awk-Skript.

Das Skript sieht bisher so aus:

Code: Alles auswählen

#!/usr/bin/awk -f
BEGIN {
        /^pattern*/
        n=12;
}
{  if (n < FNR ) exit;  }
{  print $0;  }
Ich lasse nun das Skript über ein logfile laufen und möchte alles ab der Zeile, in der das pattern vorkommt, ausgeben bzw. ab dem pattern die nächsten 12 Zeilen ausgeben.

Es werden aber nach dem pattern nur 7 Zeilen ausgegeben und vor dem Pattern auch schon 4.

Was mache ich falsch???
Zuletzt geändert von Duff am 22.06.2007 07:59:19, insgesamt 1-mal geändert.
Oh, yeah!

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von gms » 21.06.2007 18:04:11

Duff hat geschrieben: Was mache ich falsch???
kann ich dir leider nicht beantworten, verstehe dein Script nicht, bzw kann ich mir nicht vorstellen, daß es das tut, wie du es beschrieben hast. Meiner Meinung nach gibt dein Script, je nachdem wie du den Syntaxfehler beim Pattern behebst, entweder gar nichts, oder immer die ersten 12 Zeilen aus :?

ich würde das ungefähr so angehen:

Code: Alles auswählen

root@gms4:~# for ((i=0; $i<30; i++)); do echo $i; done >x.txt
root@gms4:~# awk '/^8$/{n=1} (n>=1 && n<=12) { print $0; n++}' x.txt
8
9
10
11
12
13
14
15
16
17
18
19
Gruß
gms

Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Beitrag von Duff » 21.06.2007 20:10:21

Danke für die Antwort.

Das ganze Problem ist eigentlich folgendes.
Ich habe ein tail auf ein Logfile. In dem Logfile steht ne ganze Menge und ich will immer nur einen bestimmten Teil. Alle 10 Minuten kommen neue Einträge in das logfiles und die relevanten Zeilen fangen immer mit dd-mm-yyyy hh:mm:ss an. Ab diesem Pattern möchte ich dann immer die nachfolgenden 10 Zeilen ausgegeben haben.

Hatte es bisher immer so gemacht, dass ich mit awk '/pattern1/,/pattern2/' den Bereich angegeben habe. Nur ist mir jetzt aufgefallen, dass zwar pattern1 immer gleich bleibt, sich aber die Reihenfolge von pattern2 verändert, so dass ich dann unter Umständen nicht die gewünschten 10-Zeilen sehe, sondern nur 2 oder 3.

Hoffe, dass mein erklärungsversuch halbwegs verständlich war ;-)
Oh, yeah!

Benutzeravatar
AK-Palme
Beiträge: 411
Registriert: 25.05.2004 15:38:30
Kontaktdaten:

Beitrag von AK-Palme » 21.06.2007 21:45:51

Code: Alles auswählen

cat <file> | grep -A 12 'pattern'
gut wa :)

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von gms » 21.06.2007 22:06:55

so gehts auch :)

Code: Alles auswählen

grep -A 12 'pattern' <file>

Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Beitrag von Duff » 22.06.2007 07:47:51

Danke, aber es handelt sich bei dem System um HP-UX und da kennt grep die Option -A nicht.

Code: Alles auswählen

grep: illegal option -- A
...deshalb der Versuch mit awk...

Aber so wie du es oben beschrieben hattest gms funktioniert es.

Code: Alles auswählen

tail -100f logfile | awk '/ZeitPattern/ {n=1} (n>=1 && n<=10) { print $0; n++}'
Oh, yeah!

Antworten