Moin,

Zitat von
BLUESCREEN3D
In ' werden von der Shell keine Variablen ersetzt. Du musst statt ' einfach " nehmen.
das ist aber gefährlich - und gibt Probleme:
Code:
jan@jack:~/tmp/awk_falle> cat awk_falle.sh
#! /bin/bash
export ZAHL=20
awk " NR<=$ZAHL { print $0 } " file.ini
jan@jack:~/tmp/awk_falle> ./awk_falle.sh
awk: Kommandozeile:1: NR<=20 { print ./awk_falle.sh }
awk: Kommandozeile:1: ^ syntax error
awk: Kommandozeile:1: NR<=20 { print ./awk_falle.sh }
awk: Kommandozeile:1: ^ Nicht-beendeter Regulärer Ausdruck
awk: Kommandozeile:2: (END OF FILE)
awk: Kommandozeile:2: syntax error
jan@jack:~/tmp/awk_falle> cat awk_falle_entkommen.sh
#! /bin/bash
export ZAHL=20
awk -v zahl=$ZAHL ' NR<=zahl { print $0 } ' file.ini
jan@jack:~/tmp/awk_falle> ./awk_falle_entkommen.sh
Item1=a_b_c
Item2=33
Item3=4544
Item55=A
letzte Zeile, die geschrieben werden soll
die Zeile soll nicht mehr auftauchen
Was ist das Problem? Ganz einfach - $0 ist in jedem Shell-Script der Progammname und wird natürlich durch die fleißige Shell genauso wie $ZAHL ersetzt, bevor der awk überhaupt zum Zug kommt.
@FireF: Und das funktioniert bei Dir??? *verwirrt guck*
Besser ist die -v Option des awk, die Shellvariablen an awk-Variablen übergibt.
Ein anderes Problem habe ich jetzt erst so richtig mitgekriegt (siehst Du oben in der Ausgabe). In meinem vorigen Posting habe ich reine Syntax-Kosmetik betrieben, aber jetzt bin ich auf die semantische Fußnote gestoßen ;-) Du willst einfach nur alle Zeilen bis zum letzten "Item123=..." plus der nächsten Zeile ausgeben, oder irre ich mich da?
Dann geht Deine Logik natürlich baden, wenn die Item-Zeilen nicht fortlaufend durchnummeriert sind - und nebenbei kann man diese Aufgabe viel einfacher lösen:
Code:
ZAHL=`sed -n '/^Item[0-9]\+=.*/=' file.ini | tail -1`
test -z "$ZAHL" && exit 1
head -n `expr $ZAHL + 1` file.ini
Der Modifier "/=" im sed macht die Arbeit - wie vorher wird dem sed ein Nuckel in den Mund gesteckt (-n), damit er nicht losbrüllt und mit dem Modifier wird bei einer passenden Zeile die Zeilennummer (nicht der Inhalt) ausgespuckt. Davon noch die letzte Ausgabe - schon haben wir die letzte passende Zeilennummer. Völlig unabhängig davon, ob da auskommentierte Zeilen sind, Lücken in den Nummern auftauchen usw. Sollte eigentlich (wenn ich Dich nicht völlig falsch verstanden habe) wesentlich betriebssicherer sein.
Und so sieht es aus:
Code:
jan@jack:~/tmp/awk_falle> ZAHL=`sed -n '/^Item[0-9]\+=.*/=' file.ini | tail -1`
jan@jack:~/tmp/awk_falle> head -n `expr $ZAHL + 1` file.ini
Item1=a_b_c
Item2=33
Item3=4544
Item55=A
letzte Zeile, die geschrieben werden soll
Jan
Lesezeichen