Rückgabe von sed (nach suchen und ersetzen)

Lord_Icon

Blog Benutzer
Hi,

mittels

Code:
sed 's:'/etc/postfix/virtual_mailbox_domains':'/etc/postfix/FAKE/virtual_mailbox_domains':' -i main_spielwiese.cf

ersetze ich in einer Datei einen Pfad. Klappt soweit.

Fraglich ist jetzt nur:
Wie kann ich jetzt rausbekommen, ob sed tatsächlich einen Treffer hatte.
Sprich: Wenn sed was gefunden und ersetzt hat, dann muß der Dienst restartet werden.
Das will ich aber nur machen, wenn tatsächlich Änderungen erfolgt sind


Hat einer eine Idee wie ich das umsetzen könnte ?
 

storvi

New Member
Quick and dirty oneliner - geht mit Sicherheit auch schöner.

Anmerkung: MacOS - bei Linux müsstest du wahrscheinlich "md5sum" als Command nehmen.

den ersten echo-Befehl kannst du gegen dein sed-Kommando austauschen, den zweiten gegen restart-Befehl.

Code:
export md5_vorher=$(md5 test) && [COLOR="Red"][B]echo "test" > test[/B][/COLOR] && export md5_nachher=$(md5 test) && diff <(echo "$md5_vorher") <(echo "$md5_nachher") 2>&1 > /dev/null|| [COLOR="Red"][B]echo "test"[/B][/COLOR]

Erklärung:
Du bringst über die export-Befehle die Checksummen der Datei in Umgebungsvariablen, die du über den diff-Befehl vergleichst. Wenn die Checksummen gleich sind, dann gibt der diff-Befehl "0" als exit-Code zurück und beendet die Ausführung. Wenn die Checksummen ungleich sind - also sed an der Datei etwas geändert hat, dann ist der Exit-Code 1 und die zweite Oder-Bedingung greift - in deinem Fall dann Dienstrestart.

Gruß
Markus
 

Fusl

Blog Benutzer
Hi,

sollte so funktionieren (ungetestet):

Code:
 _ echo "search and replace" | sed '/search/,${s//replace/;b};$q1'; echo $?
replace and replace
0
 _ echo "meow and replace" | sed '/search/,${s//replace/;b};$q1'; echo $?
meow and replace
1
 

DeaD_EyE

Blog Benutzer
Ich würde es in Python machen. Das kann ein Mensch wenigsten noch lesen und nachvollziehen.

Erstaunlich finde ich es aber, dass nur eine Zeile Code ausreicht. Hat alles seine Vor- und Nachteile.
 

storvi

New Member
Ich hatte nur in der manpage von sed gesehen, dass der reguläre Exit-Code bei fehlerfreiem Durchlauf 0 ist und nur im Fehlerfall 1.

Fusl Lösung scheint da mit noch etwas mehr sed-Magie zu arbeiten, während meine "Lösung" relativ stumpf ist.

Mittels python, könnte man das Ganze natürlich schön sauber lösen - ich dachte nur nicht, dass das hier gewollt ist :)

Gruß
Markus
 

DeaD_EyE

Blog Benutzer
Ja das hängt halt davon ab, was einem persönlich lieber ist. Mit Shell-Scripts ist es oftmals viel weniger Code, weil die Tools einfach auf das OS zugeschnitten sind. Sobald es mit Regex anfängt, nutze ich persönlich lieber Python als Shell-Scripts, weil man bei Shell-Scripts alles mögliche escapen muss. Der Code ist unleserlich und man braucht die komplette Sonderzeichenpalette. Letztendlich braucht man für die Aktion eigentlich kein regex, sondern nur str-Operationen. Sachen wie Mail, Log usw. lassen sich dann auch schön integrieren. Geht natürlich alles auch in Shell-Scripts. Doof ist nur, wenn man nach einem halben Jahr seinen eigenen Code nicht mehr versteht.

Ich hab damals so ein blöden Updater für Gameserver in Python geschrieben. Der Code ist so.... schlecht ist untertrieben. Das Schlimme ist, dass es funktioniert und ich zwischendruch noch Änderungen vornehmen musste. Der Mist ist immer noch im Einsatz und ich hoffe, dass ich daran nie wieder was machen muss, da mich Gameserver unter anderem zur Zeit eh nicht mehr so interessieren.
 
Last edited by a moderator:

Firewire2002

Registered User
Ich würde es in Python machen. Das kann ein Mensch wenigsten noch lesen und nachvollziehen.

Ich hab damals so ein blöden Updater für Gameserver in Python geschrieben. Der Code ist so.... schlecht ist untertrieben.

Ja was denn nun? Wenn man deine 2 Aussagen nun also kombiniert, heißt das: dein Python Code ist grottig und deine Bash Scripte noch viel schlechter. Spricht nicht für dich. ;)
Ob Code leserlich und verständlich ist, liegt in aller erster Linie an dem jenigen der ihn geschrieben hat. Da kann die Sprache/Syntax in den meisten Fällen überhaupt nichts dafür.
 

DeaD_EyE

Blog Benutzer
Der Zeitdruck zwang mich dazu eine schnelle Lösung zu finden.

Ich habe damals die SteamAPI genutzt um die Version der Server abzufragen und dann ggf. Upzudaten, falls erforderlich. Danach, ein rsync auf alle Server.

Bis dahin war alles gut.

Weil Valve sich nicht an das eigene Konzept gehalten hat bzw. konnte (jeder Mod mit eigener id), wurde es ziemlich kompliziert. Durch das Wegfallen des hlds-update tools und dem neuen SteamPipe wurde es pervers. Der HL1-Server hat eine eigene ID, die Mods nicht. Dann haben sie ihren Updater erweitert, damit man über Variablen den jeweiligen Mod angeben muss. Zwischendurch funktionierte der SteamUpater nicht, wozu ich gezwungen war zeitweise auf einen anderen Updater zu wechseln, der Bugfrei war. Dort besteht aber das Problem, dass sich damit keine HL1-Mods installieren lassen. Dann kam Valve noch auf die Idee manche Server nur mit Login anzubieten, andere wiederum ausschließlich mit anonmous login.

Das habe ich damals noch zu meinen Anfangszeiten geschrieben. Hätte ich das mit Shell-Scripts geschrieben, wäre der Aufwand noch größer den Code zu warten.

Aus dem Grund mache ich eigentlich auch kaum noch was mit Gameserver. Man weiß nie, auf was für tolle Ideen die Entwickler kommen. Ich hab schon so viele Workarounds für die GS schreiben müssen...
 
Top