Shell Skripte zum Auslesen von Konfig Werten - grep ?

I

itfreak

Grünschnabel
Hallo,

ich versuche gerade folgendes Problem zu lösen:

In einer Datei treten mehrfach folgende Sequenzen mit unterschiedlichen Werten auf:

Code:
comment {
	host_name=xxx
	comment_id=1234
	persistent=0
	expire_time=0
	author=Mr X.
	comment_data="HalloWelt"
	}

Nun soll anhand des Atrributes "comment_data" auf die comment_id geschlossen werden. Also Eingabe "HalloWelt" und return "1234".

Lässt sich das umetzen ?

Ich habe bisher diesen Befehl:
Code:
less status.dat | grep comment_data | tail -4

Wie bekomme ich den grep dazu das er mir die vorhergegangen Zeilen mitausgibt?

Comentan bekomme ich nur die Zeile: comment_data="HalloWelt"

Vielen Dank für Hilfe.
 
Zuletzt bearbeitet:
Deine grep-Syntax ist unnoetig ueberladen, die zu durchsuchende Datei solltest Du nicht vorher an 'less' uebergeben. Und der Parameter, den Du vermutlich suchst, ist '-B'
Code:
grep -B4 comment_data status.dat
. Diesen Ausdruck kannst Du nun weiterverarbeiten. Setzt allerdings voraus, dass der Eintrag 'comment_id' auch tatsaechlich in den vier Zeilen vor 'comment_data' vorkommt. Ansonsten musst Du wohl eine Sprache wir awk oder perl benutzen.
 
Wenn deine Daten immer so aussehen wie im Beispiel, also zunächst ein 'comment_id= ...' gefolgt von 'comment_data="..."' mit dem gesuchten String, kannst du auch sed versuchen:
Code:
SEARCH="HalloWelt"
sed -n -e '/comment_id/h' -e '/comment_data="'$SEARCH'"/{p;x;p}' <status.dat

Gruss, A.
 
ich würde meinen dass das eine Anwendung für awk ist,

was passiert denn wenn du mal folgendes machst?

Code:
awk 'BEGIN{RS="{", FS="/n" } {print $2 $6}'
 
@tuxlover: Die Syntax scheint ziemlich verhauen, zumindest mit GNU awk 3.1.5. Besser scheint es mit
Code:
 awk 'RS="{", FS="\n"  {print $2 $6}' test.datei
zu funktionieren.
 
Hey, vielen danke für die Hilfe, hätte ich nie hinbekommen.

Das letztere funtzt in meinem Fall nicht zuverlässig. Liegt daran das noch anderes Strukturen in der status.dat ,also comments mit weniger Attributen auftauchen.

Hab das mit dem grep gemacht.

Aber ich habe da noch ein anderes Problem:

Ein weiteres Skript soll nun auch nach dem Alter des Commentares Filtern.
Code:
servicecomment {
    host_name=xzy
    service_description=Process:Watcher
    entry_type=1
    comment_id=1234
    source=1
    persistent=0
    entry_time=1286789896
    expires=0
    expire_time=0
    author=server
    comment_data=HelloWorld
    }
Code:
text='author=server'
path='./status.dat'
grep -B6 "$text" "$path" | grep entry_time |sed 's/entry_time=//g' 
grep -B6 "$text" "$path" | grep comment_id | sed 's/comment_id=//g'

So erhalte ich zwei Listen:
Mit einem Timestamp
Code:
       1286789896
        1286790016
        1286790137
        1286790257
        1286790378
        1286790498
        1286790619
        1286790739
        1286790860
        1286790980
        1286791100
        1286791221
        1286791341
        1286791462
        1286791582
        1286791702
        1286791823
        1286791943
        1286792064
        1286792184
        1286792305
        1286792425
        1286792545
        1286792666
        1286792787
        1286792907
        1286793028
        1286793148
        1286793269
Und einer ID
Code:
        8492
        8493
        8494
        8495
        8496
        8497
        8498
        8499
        8500
        8501
        8502
        8503
        8504
        8505
        8506
        8507
        8508
        8509
        8510
        8511
        8512
        8513
        8514
        8515
        8516
        8517
        8518
        8519
        8520
        8521

Nun möcht ich nur die ID mit einem bestimmten Alter erhalten um diese dann einzeln ein einen Befehl einzubinden. Also sie müssen gefiltert werden und die verbleiben Liste in einzelne Variablen geschrieben werden.

Mir würde ja spontan einfallen die Augabe der beiden Befehle in ein Array zu packen und die dann in einer for-Schleife auszuwerten und dort dann auch den Behel mit der comment_id abzusetzen.

Aber ich komm nicht drauf wie ich die Ausgabe in ein Array bekomme.

Geht sowas mit der Shell überhaupt ?

Vielen Dank für Hilfe im Voraus.
 
Zuletzt bearbeitet:
Zurück
Oben