property-file per skript prüfen

E

electren

Jungspund
Hallo...
ich hab folgendes property-file
Code:
<!-- yyy-->
	integration=yyy.xxxx.de
	integration_user=bbb
	integration_password=ccc
	integration_dir=....
	integration_chmod=775

<!-- zzz-->
	wartung=zzz.xxx.de
	wartung_user=bbb
	wartung_password=ccc
	wartung_dir=...
	wartung_chmod=775

Außerdem steht in dem File eine Variable
hostlist=integration,wartung

Die properties werden für ein ANT-Skript verwendet, in welchem es eine for-Schleife gibt, die nacheinander die Host abarbeitet.
Die Schleife verwendet die hostlist als list...

Jetzt würde ich gerne in dem shell-skript welches das ANT aufruft, am Anfang so eine Art Update einbaut, welches das File durchgeht, und z.b. nach "<!--" sucht, eine Zeile tiefer sich den String vor "=" ruassucht und das dann in hostlist schreibt....

Ich denk mit sed bin ich da gut bedient... oder?

Hat jemand ne Idee?

Grüße ele
 
Kann es auch perl sein?

Schnellschuss:

Code:
[~]$ hostlist=($(perl -0\777 -ne 'print join " ",/<.*?>\n.*?=(.*?)\n/g' property-file))
[~]$ echo ${hostlist[0]}
yyy.xxxx.de
[~]$ echo ${hostlist[1]} 
zzz.xxx.de

edit: Kleine Verbesserung.
 
Zuletzt bearbeitet:
Hallo

Also wenn du wirklich vor = meinst, dann erschließt sich mir der Sinn nicht wirklich.
Aber das geht auch mit sed:
Code:
$ sed -ne '/</{N;s/.*\n\([^=]*\)=.*/\1/g;p}' testdatei
integration
wartung
Meinst du den ersten Wert also nach =
Code:
$ sed -ne '/</{N;s/.*\n[^=]*=\(.*\)/\1/g;p}' testdatei
yyy.xxxx.de
zzz.xxx.de

Gruß Wolfgang
 
Vielen Dank für die Antwort.

Ich meine tatsächlich den Wert vor dem "="...#

Leider versteh ich das sed - command nich mal annähernd :think:

Für was steht das $ zu Beginn?
das verursacht nämlich: command not found..

Lass ich es weg: sed: command garbled: /</{N;s/.*\n\([^=]*\)=.*/\1/g;p}

?(
 
electren schrieb:
Vielen Dank für die Antwort.

Ich meine tatsächlich den Wert vor dem "="...#

Leider versteh ich das sed - command nich mal annähernd :think:

Für was steht das $ zu Beginn?
das verursacht nämlich: command not found..

Lass ich es weg: sed: command garbled: /</{N;s/.*\n\([^=]*\)=.*/\1/sg;p}

?(

Das $ steht für das shell-Prompt. Also nicht mittippen ;)

Welches sed nutzt Du? Welches OS?

edit: Falls sed nicht funzt, hier nochmal die angepasste perl-Lösung:

Code:
perl -0\777 -ne 'print join " ", /<.*?>.*?(\w*?)=/gs' property-file
 
Zuletzt bearbeitet:
OS is SunOS 5.9

Welches sed - kann ich dir nicht sagen..

EDIT:
das perl macht leider garnix....

Was sollte es denn machen?
 
Zuletzt bearbeitet:
electren schrieb:
OS is SunOS 5.9

Welches sed - kann ich dir nicht sagen..

EDIT:
das perl macht leider garnix....

Was sollte es denn machen?

Sorry, hatte /s vergessen. Versuch es nochmal:

Code:
[~]$ hostlist=($(perl -0\777 -ne 'print join " ",/<.*?>.*?(\w*?)=/gs' property-file))
[~]$ echo ${hostlist[0]}
integration
[~]$ echo ${hostlist[1]}
wartung

Es sollte theoretisch die Liste liefern.
 
Hallo

Wenn du das mit sed nicht hinbekommst, ist am portabelsten die version mit -f<SCRIPTFILE>
Sprich schreib folgendes in eine Datei:

#Sedscript:
#select first match befor = after line with match ^<
/</{
N;
s/.*\n\([^=]*\).*/\1/g;
p;
}
Benenn die Datei wie du willst.
Ich nenn sie sed_script
Code:
sed -nfsed_script inputdatei >>liste
Falls es dann Fehler gibt, entferne die Semikola, da du vermutlich kein GNU sed hast.
Für Perl habe ich auch noch eine Variante auf Lager ;)
Code:
perl -0\074 -ne 'print "$1\n" if /.*?\n(.*?)=/sg' eingabedatei >>ausgabedatei
;)

Gruß Wolfgang
 
ahh - ok..
du suchst dir das 1. "=" und schreibst den Wert davor in ${hostlist}.

Lässt du dann immer die nächsten 4 "=" aus.. ??

Gemeint hatte ich es anderst:

Am Anfang stehen noch viele andere properties - d.h.
Ich hab Werte in der Liste die ich nich will.
Die einzigste Möglichkeit ist, die Stellen abzusuchen, wo die Namen der Hosts stehen, also: Suche <!--xxx--> und von da aus dann (eine Zeile runter - dort suche "=") und was davor steht is der Wert.

Das mit der hostlist - is ein property in dem property-file... d.h.
da steht am Anfang: hostlist=integration,wartung,test

So speichert er es ja in ein Variablen-Array... aber ich denke, es von da in das file zu bekommen, in die Liste - is nicht so das Problem....
 
Hallo
Sorry, aber so wird das nix.
Wenn du Probleme hast deine Aufgabe richtig zu beschreiben, dann hilft es oft weiter, Beipieldaten und das erwartete Ergebnis zu posten.

Wie soll hier jemand sonst wissen, welche Werte du willst und welche nicht.
Ich habe mich präzise an deine geschilderte Aufgabe gehalten.

und z.b. nach "<!--" sucht, eine Zeile tiefer sich den String vor "=" ruassucht

Also welche Werte willst du nun wirklich?
Wie du die Ausgabe in eine Datei umleitest, habe ich bereits geschildert.

Gruß Wolfgang
PS Die Lösung einer Aufgabe beginnt beim analysieren!

Edit:
Um z.B. nur die erste Zeile nach einem <!-- zzz ---> auszuwerten, folgendes im File sedscript:

#Sedscript:
#select first match befor = after line with match ^<!-- zzz
/<!-- zzz/{
N
s/.*\n\([^=]*\).*/\1/g
p
}
dann halt wieder :
Code:
sed -nfsedscript eingabedatei >liste
 
Zuletzt bearbeitet:
Bei meinem Befehl wird das property-file als ein langer String betrachtet (bei Wolfgang ebenfalls). In diesem String werden alle Vorkommen des folgenden Musters gesucht:

Code:
<beliebige Zeichen>beliebige Nicht-Wort-Zeichen(Wort-Zeichen)=

und der in den Klammern () vorhandene String wird ausgegeben. Das join " ".. bewirkt ein Leerzeichen zwischen den gefundenen Wörtern. Durch ($()) wird die ausgebene Liste im Bash-Array ${hostlist[*]} gespeichert, da ich annahm, dass Du die Liste so willst.

Leider werd ich nicht so richtig schlau, was genau Du mit der Liste anfangen willst. Also besser nochmal erklären :)

edit: Muss Wolfgang beipflichten, Deine Aufgabenstellung ist etwas konfus...
 
Zuletzt bearbeitet:
ok.. sorry..
du hast recht..

ganz oben war noch ein <!-- welches die Überschrift umgiebt...

Vielen Dank für eure Hilfe!!!!!!

Wegen der hostlist - hab ich mich wohl ncih deutlich ausgedrückt...

Ich hatte eigentlich vor die Property-Datei zu bearbeiten...

also das property hostlist würde jetzt so aussehn:
hostlist=integration,wartung,test
da ich noch die Daten der Testmaschine eingeschrieben hab....

quasi:
hostlist=${hostlist[0]},${hostlist[1]},${hostlist[2]}

Vielen Dank und nen schönen Abend ... grüße
ele


EDIT:
Nicht nur meine Aufgabenstellung ist konfus :-))

Ich schreib das komplette property-file so um - dass ich es verööfentlichen kann...
Vielleicht wird es dann klarer...
es is schon spät... langer Tag gehabt... habt Nachsehn.. :-))
 
Zuletzt bearbeitet:
Hier noch der angepasste Perl-einzeiler.
Code:
perl -0\074 -ne 'print "$1\n" if /-- zzz.*?\n(.*?)=/sg' eingabedatei >>liste
Das schreibt bei deinen vorgegebenen daen wartung in die Datei liste.
Der Inputseperator ($/) wird bei mir auf oktal 74 gesetzt, was dem Zeichen < entspricht.
Dann suche ich nach dem ersten Wert vor einem = nach der Zeile mit <!-- zzz
, wobei im Puffer die Zeile dann mit !-- zzz --> beginnt.

Der Wert ist dann folglich Wartung.
Falls gewünscht, erklär ich auch das Sedscript.

Gruß Wolfgang
 
Code:
================================================================
      THIS IS THE CONFIGURATION FILE FOR THE BEST SYNCHRO-TOOL :-)


 lokale Properties
	output: Hier liegen die Dateien die ausgeliefert werden.
	hostlist: Hier die hosts hinzufügen auf welche verteilt werdden soll.

	output=output
	hostlist=integration,wartung
	hostname=host
	
<!-- xxx -->
	integration=xxx.blubber.de
	integration_user=user
	integration_password=pwd
	integration_dir=/prog/prog/temp/electren
	integration_chmod=775

<!-- zzz -->
	wartung=zzz.blubber.de
	wartung_user=user
	wartung_password=pwd
	wartung_dir=/prog/prog/tmp/electren
	wartung_chmod=775
	
<!-- testefix -->
	test=zzz.blubber.de
	test_user=user
	test_password=pwd
	test_dir=/prog/prog/tmp/electren
	test_chmod=775

Jetzt müsste das SKript quasi merken das es noch die testefix gibt - die aber nicht oben in der hostlist steht... und sie da dann rein schreiben...

:))
 
Mein Vorschlag:

Code:
perl -0\777 -pi -e 's!hostlist=.*?\n!"hostlist=".(join ",", /<.*?>.*?(\w*?)=/sg)."\n"!se' property-file

Gruss, Xanti
 
Zurück
Oben