Wie awk NR eine Variable übergeben ?

Hallo,

ich tüftel gerade an einem Script mit dem ich ein Logfile nach Fehlern auswerten kann. Ich suche nach dem aktuellen Datum , und von da ab suche ich nach den Fehlern.
Wenn ein Fehler enthalten ist, dann will ich die Zeile oben drüber ebenfalls haben, den nda stehen Datum und Uhrzeit drin.

Mein Problem ist, das " awk 'NR == $VAR" zum Übergeben der Zeilennummer nicht funktioniert.
Wie kann ich die Zeilenzahl übergeben ?

Nicht so genau hinsehen, ich teste immer nur einzelne Zeilen, deshalb weiß ich noch nicht ob das gesammte überhaupt funktionieren würde (wenn das mit NR == $VAR gehen würde)

declare -i STARTCOL=1
declare -i ENDCOL=1
STARTCOL=$(cat alert.log | grep -n „$(date ‚+%a %b %e‘)“ | awk ’ NR == 1’ | cut -d „:“ -f1)
ENDCOL=$(wc -l alert.log)

while [$STARTCOL -le $ENDCOL] ; do
MELDUNG=awk ‚NR == $STARTCOL‘ alert.log | awk ‚/ORA-|Error|ALTER/‘

if [! -z ${MELDUNG}]; then
DATCOL=$(expr $STARTCOL - 1)
awk ‚NR == $DATCOL‘ alert.log
awk ‚NR == $STARTCOL‘ alert.log
fi

STARTCOL=expr $STARTCOL + 1
done

Wie stelle ich das an ?
Vielleicht hat auch jemand einen total einfachen anderen Weg, aber ich habe mir schon das Hirn zermartert wie ich an die Zeile vor der Fehlerzeile ran komme.

Danke für’s Hinsehen und Grüße

Chris

Vielleicht hat auch jemand einen total einfachen anderen Weg,
aber ich habe mir schon das Hirn zermartert wie ich an die
Zeile vor der Fehlerzeile ran komme.

ich mach so etwas mit grep. man grep und die Optionen -A und vor allem -B könnten hilfreich sein.

Gruß,
Stefan

Hallo,

Ich würde das so machen:

 awk '{if(NR\>=X)print $0}' X=zeile

Gruß
Axurit

Hallo Chris,

ich tüftel gerade an einem Script mit dem ich ein Logfile nach
Fehlern auswerten kann. Ich suche nach dem aktuellen Datum ,
und von da ab suche ich nach den Fehlern.
Wenn ein Fehler enthalten ist, dann will ich die Zeile oben
drüber ebenfalls haben, den nda stehen Datum und Uhrzeit drin.

Wie kann ich die Zeilenzahl übergeben ?

Du kannst Variablen an awk entweder explizit mit der Option -v übergeben, so daß Du z.B. mit dem Aufruf

awk -v foo=5 ...

die Variable foo mit dem Wert 5 in awk zur Verfügung hast, oder innerhalb von awk aus dem Array ARGV auslesen. Aber Achtung: ARGV[0] enthält den Programmnamen selbst, also awk. Ab ARGV[1] hast Du dann die Parameter und mit der Variablen ARGC die Anzahl der Parameter + 1. Jedenfalls in meiner awk-Variante ist das so (es gibt in awk, gawk und Konsorten manchmal Unterschiede).
Aber ich halte diesen Ansatz für ziemlich umständlich, was man schon daran sieht, daß ich bei deinem Skript schon einen leichten Knoten ins Hirn bekommen habe :wink:
Wie schon erwähnt wurde, lässt sich das mit grep sicher besser lösen.

Nicht so genau hinsehen,

Habe ich auch nicht, weil s.o. …
Ein erster Ansatz von mir (wenn ich alles richtig verstanden habe), wäre so:

VON=/`date '+%a %b %e'`/
sed -n "$VON,$ p" alert.log | grep -A1 'ORA-\|Error\|ALTER'

Mit sed -n „$VON,$ p“ sorge ich erstmal dafür, daß nur der Teil ab dem heutigen Datum (=$VON) bis zum Dateiende (=$) ausgegeben wird, den ich dann an grep weiterreiche, das nach den Error-Wörtern sucht und diese und die nachfolgende Zeile ausgibt (wegen -A1).

Wenn Du unbedingt awk haben möchtest, kannst Du auch die Konstruktion

/VON/,/BIS/

benutzen, die, wie Du dir denken kannst, alles zwischen den Mustern VON und BIS ausgibt (einschliesslich). Wenn Du für VON deine Error-Wörter einsetzt und für BIS das heutige Datum dürfte das denselben Effekt haben. Der Witz an der Sache ist eben nur, daß Du vorher mit sed alle in der Vergangenheit liegenden Zeilen wegwirfst.
Ich hoffe, das hilft dir etwas weiter, denn getestet habe ich das nicht großartig.

Viele Grüße
Marvin

Hi,

leider gibt es diese Optionen bei mir nicht (Solaris 5.10)

Aber Danke für deine Antwort.

Grüße

Chris

Hallo Marvin,

danke für deine ausführliche Antwort.
Die Übergabe der Variablen an awk schaue ich mir mal genauer an.

Die grep -A Funktion kann ich nicht nutzen, die ist auf meine System nicht verfügbar (Solaris 5.10)

Den sed-Teil nehme ich auch mal genauer unter die Lupe.

Gruß

Chris

Hi,

das sieht auch interessant aus, danke !

Gruß

Chris

Hallo,

zusammen mit euren Ideen und Ideenstütze von einem Kollegen, sieht es jetzt so aus:

VON=/date '+%a %b %e'/
sed -n „$VON,$ p“ alert.log | awk 'BEGIN {zeile=""}
/ORA-|ALTER/ {
print ( zeile)
print ( $0) }

/Error/ { # Sonderfall, bei einer Error-Zeile folgt immer eine ORA- Meldung
print ( zeile) }
{
zeile = $0
} ’

So sieht dann de Ausgabe aus:

Tue Sep 14 05:14:06 2010
Errors in file /app/oracle/admin/TESTDB/udump/testdb_ora_26257.trc:
ORA-07445: exception encountered:…
Tue Sep 14 06:44:27 2010
ALTER DATABASE DATAFILE ‚/app/orafiles/testdb/data/users.dbf‘ RESIZE 12M
Tue Sep 14 06:45:27 2010
Completed: ALTER DATABASE DATAFILE ‚/app/orafiles/testdb/data/users.dbf‘ RESIZE 12M
Tue Sep 14 08:44:55 2010
ORA-1652: unable to extend temp segment by 128 in tablespace TEMP

Nochmal vielen Dank an alle !

Grüße

Chris