PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Wie kann ich das realisieren?



geier
30-07-2003, 13:28
hallo zusammen,

ich hab noch nie nen 'richtiges' shell script geschrieben, bräuchte aber jetzt ne lösung für mein problem :)

ich habe eine textfile mit folgendem aubau


befehl1 wert1
befehl1 wert2
befehl1 wert3
. .
. .
. .
wbefehl variable (-> hätte den z.b. wert1 oder wert2 etc)


ich hab also z.b. ein script mit 11 Zeilen, die ersten 10 zeilen beginnen jeweils befehl1, dann kommt ein leerzeichen und dann der entsprechende wert (wert1 - wert10). die 11. zeile beginnt mit 'wbefehl', der wert der variable kann einen dieser 10 werte (wert1 - wert10) annehmen.

jetzt möchte ich aus der textfile den aktuellen wert der variable ermitteln, diese soll dann in den zeilen davor gesucht werden, um dann den wert der vorherigen zeile zu ermitteln :)

im bespiel von oben wäre das z.b. so



befehl1 wert1
befehl1 wert2
befehl1 wert3
. .
. .
. .
wbefehl wert3


das für mich wichtige wort wäre in diesem fall wert2

versteht ihr mich? :D...ich weiss, mit erklären hab ich es nicht so :p

kann mir trotzdem jemand helfen?

thx

EDIT: hab da schon in den linuxforen angefragt und auch antwort bekommen, aber da blicke ich nicht durch :)

Folgende Lösung ist zwar nicht sehr effizient, aber recht anschaulich: grep -B1 "^b.*`tail -1 [datei] | cut -d " " -f 2`" [datei] | head -1 | cut -d " " -f 2.

gibts ne lösung, die ich verstehe bzw könnt ihr mir helfen das zu verstehen? :)

thx

sagi
30-07-2003, 19:34
grep -B1 "^b.*`tail -1 [datei] | cut -d " " -f 2`" [datei] | head -1 | cut -d " " -f 2.

ok. gehen wir das mal durch:


`tail -1 [datei] | cut -d " " -f 2`

dieser Teil des Statements wird als 1. interpretiert, und dann in das andere Statement eingesetzt.

tail -1 gibt die letzte Zeile des Files aus (wbefehl wert3)

cut -d " " -f2 trennt wbefehl von wert3. (-d " " gibt den Trenner an - ein einfacher Space; -f2 bedeutet, dass die 2. Spalte (wert3) in den Outputstream geschriebe werden soll.

damit kann die expression schon mal vereinfacht werden:


grep -B1 "^b.*wert3" [datei] | head -1 | cut -d " " -f 2.

grep gibt nun alle Zeilen aus, die mit "b" beginnen und "wert3" enthalten. "-B1" bedeutet, dass auch eine Zeile davor ausgegebwen werden soll (also die Zeile mit wert2).

head -1 schneidet nun alles nach der 1. Zeile weg. es bleibt also nur noch die zeile mit wert2.

cut trennt nun wieder zwischen befehl und wert und gibt den Wert aus.

mfg

c.

geier
31-07-2003, 08:10
super erklärung...besten dank :)

geier
31-07-2003, 10:22
eins habe ich nicht brücksichtigt...:)

wenn ich mit
grep "^b.*wert3" [datei] die erste zeile ermittle, gibt mir B1 natürlich immer die erste Zeile aus. In diesem Fall wäre für mich nicht die Zeile davor, sondern die vorletzte Zeile der Textdatei interessant. Geht das vielleicht auch? :D