2Danke
ERLEDIGT
NEIN
NEIN
ANTWORTEN
11
11
ZUGRIFFE
1344
1344
EMPFEHLEN
-
24.02.10 12:11 #1OnePixel Tutorials.de Gastzugang
Hallo @All,
ich habe ein Problem mit sed und hoffe hier auf Hilfe bzw. Lösung meines Problems
zu meinem Probem:
Ich möchte in der "resolv.conf" einen nameserver hinzufügen, der unter dem letzten nameserver-EIntrag stehen soll. Ich wollte also nun mit sed
den letzten nameserver am Zeilenanfang suchen und unter dem eine Leerzeile einfügen und in einem weiteren sed Befehl den neuen nameserver eintragen.
Der zweite Befehl funktioniert auch jedoch kann ich mit sed nicht den ersten umsetzen (den letzten nameserver am Zeilenanfang suchen und eine Leerzeile unter diesem einfügen.
Der zweite Befehl sieht bei mir wie folgt aus:
cat /etc/resolv.conf | sed "s/^$/nameserver 999.999.99.9/" > /etc/resolv.conf
Die resolv.conf besitzt bei mir folgende Syntax:
domain meineDomain.com
nameserver 999.999.99.9
nameserver 888.888.88.8
nameserver 777.777.77.7
search meineDomain.com meinedomain.net
Die sed-Befehle sollen dann in ein sh script, welches auf verschiedenen Servern ausgeführt wird. Die Anzahl der nameserver variert. Über die Zeile kann man also leider nicht gehen.
Könnt ihr mir helfen?
Danke schon mal im vorraus.
Lieben Gruß
OnePixel
-
Hallo OnePixel,
probier mal folgendes Shell-Skript:
Code bash:1 2 3 4 5 6 7
#!/bin/sh FILE="/etc/resolv.conf" ENTRY="nameserver 666.666.66.6" LINE=`sed -n '/^nameserver /=' "$FILE" | tail -n 1` sed -i "${LINE}a${ENTRY}" "$FILE"
Grüße,
Matthias„Gib einem Menschen einen Fisch, und er wird für einen Tag satt. Lehre ihn Fischen, und er wird ein Leben lang satt.“
“For every complex problem, there is an answer that is short, simple and wrong.”
“Pessimism is safe, but optimism is a lot faster!”
Aktuelles Coding Quiz: #17 - Wörter kreuz und quer
-
24.02.10 18:59 #3OnePixel Tutorials.de Gastzugang
ERSTMAL DANKE FÜR DIE SCHNELLE ANTWORT

habe es mal ausgeführt, jedoch mit folgender Fehlermeldung:
Syntax: tail [+/-[n][lbc][f]] [datei]
tail [+/-[n][l][r|f]] [datei]
sed: Unzulässige Option -- i
Kann damit leider nichts anfangen....
habe selbst auch nochmal probiert:
mit folgendem Kommando bekomm ich eine Leerzeile unter allen Zeilen, die mit nameserver beginnen. Kennst du das Metazeichen, mit dem ich sage,
dass er nur das letzte Vorkommen von nameserver benutzen soll?
cat /etc/resolv.conf | sed '/^nameserver/G'
Habe gehofft das man nur noch nen .? an die richtige Stelle fixieren müsste.....
Danke schonmal
Lieben Gruß
OnePixel
-
Oh, da hab ich wohl ein paar GNU-Erweiterungen verwendet. Probier es mal so:
Das -i bei sed sollte dafür sorgen, dass die Datei in-place bearbeitet wird. Kann man aber auch mit cat erreichen. \edit: Quatsch. Man muss eine temporäre Datei verwenden, wie deepthroat weiter unten anmerkt. Habe das Skript mal ausgebessert.Code bash:1 2 3 4 5 6 7 8 9
#!/bin/sh FILE="/etc/resolv.conf" ENTRY="nameserver 666.666.66.6" TMPFILE="`tempfile`" LINE=`sed -n '/^nameserver /=' "$FILE" | tail -1` sed "${LINE}a${ENTRY}" "$FILE" >"$TMPFILE" mv "$TMPFILE" "$FILE"
Ich bezweifle, dass das mit einem sed-Aufruf alleine funktioniert. sed arbeitet ja zeilenweise und man kann nicht feststellen, ob eine Zeile die letzte ihrer Art ist, ohne alle restlichen Zeilen durchzulaufen. Ich lasse mich da aber gerne eines besseren belehren, da ich kein Experte im Umgang mit sed bin.
Grüße,
MatthiasGeändert von Matthias Reitinger (25.02.10 um 15:08 Uhr)
„Gib einem Menschen einen Fisch, und er wird für einen Tag satt. Lehre ihn Fischen, und er wird ein Leben lang satt.“
“For every complex problem, there is an answer that is short, simple and wrong.”
“Pessimism is safe, but optimism is a lot faster!”
Aktuelles Coding Quiz: #17 - Wörter kreuz und quer
-
25.02.10 13:58 #5
- Registriert seit
- Jun 2005
- Beiträge
- 8.168
Geändert von deepthroat (25.02.10 um 15:35 Uhr) Grund: Backslash entfernt und d Befehl entfernt
If at first you don't succeed, try again. Then quit. No use being a damn fool about it.
-
25.02.10 14:08 #6OnePixel Tutorials.de Gastzugang
Hallo nochmal

also habe das Problem jetzt gelöst.
Meine Lösung:
RESOLV_CONF="/etc/resolv.conf"
AUSGABE_TAIL="`cat "${RESOLV_CONF}" | grep "nameserver" | tail -1`"
cat ${RESOLV_CONF} | sed "/${AUSGABE_TAIL}/G" | sed "s/^$/nameserver 333.33.333.3/" > ${RESOLV_CONF}
TADA
EInen riesen dank an euch ! Thanks a lot
Liebe Grüße
OnePixel
-
25.02.10 14:10 #7OnePixel Tutorials.de Gastzugang
Und ein riesen WOW an dich deepthroat.
Krasse Sache
DANKE
-
25.02.10 14:25 #8
- Registriert seit
- Jun 2005
- Beiträge
- 8.168
Hast du das getestet? Normalerweise wird bei dieser Art Umleitung zuerstmal die Datei auf 0 Byte geschrumpft bevor cat überhaupt anfängt zu lesen. In der Regel ist das reine Glückssache falls es funktioniert.
Du mußt entweder die Datei erstmal komplett in den Speicher lesen (ist ja nicht so groß) oder temporäre Dateien verwenden.
Was für ein Betriebssystem verwendest du denn? Welche Shell?
Gruß
PS: Und bitte verwende die Code-Tags für deine Codeschnipsel!Geändert von deepthroat (25.02.10 um 14:28 Uhr)
If at first you don't succeed, try again. Then quit. No use being a damn fool about it.
-
„Gib einem Menschen einen Fisch, und er wird für einen Tag satt. Lehre ihn Fischen, und er wird ein Leben lang satt.“
“For every complex problem, there is an answer that is short, simple and wrong.”
“Pessimism is safe, but optimism is a lot faster!”
Aktuelles Coding Quiz: #17 - Wörter kreuz und quer
-
25.02.10 15:33 #10
- Registriert seit
- Jun 2005
- Beiträge
- 8.168

Ich dachte das wäre selbstdokumentierender Code?!
Die grundlegende Vorgehensweise ist folgende:
Jede Zeile wird erstmal zum Hold-Space hinzugefügt (mit einem führenden Zeilenumbruch).
Wenn die Zeile mit nameserver beginnt, dann wird der Pattern-Space gelöscht und mit dem Hold-Space vertauscht und es werden alle bisher gelesenen Zeilen ausgegeben (ohne den führenden Zeilenumbruch).
Das wiederholt sich bis die Verarbeitung am Ende der Eingabe angekommen ist (die $ Adresse). Bisher wurde immer bis zum zuletzt gelesenen nameserver Eintrag schon alles ausgegeben und es ist auch kein solcher Eintrag mehr aufgetreten, also muss jetzt der neue Eintrag ausgegeben werden und dann noch der restliche Text aus dem Hold-Space (ohne führenden Zeilenumbruch).
Man sollte das ganze evlt. doch lieber komplett in Bash schreiben.
Richtig, der Backslash muss weg. Oder nach dem Backslash muss noch ein Leerzeichen folgen, welches der Highlighter hier unterschlagen hat. (irgendwie hat mich da die Formulierung der info Seiten irritiert). Außerdem fällt mir gerade auf, das der d Befehl überflüssig ist.
GrußIf at first you don't succeed, try again. Then quit. No use being a damn fool about it.
-
26.02.10 10:59 #11OnePixel Tutorials.de Gastzugang
Also das funktioniert super. Habe ein weiteres Script geschrieben, dass dieses Script auf Server kopiert, ausführt und anschließend wieder löscht.
Dieses Script wird in der Bourne-Shell (sh) ausgeführt.
Das OS ist ein Solaris x86 Serversystem. Die Anzahl der Server sind ca. 60 und es hat alles super funktioniert. Mein Code den ich hereingestellt habe ist ja auch nur ein Teil des Scriptes.
Hier mal das komplette Script:
{noformat}
#!/bin/sh
#
###############
# Autor : Sebastian Kachel
# Mail : sebastian.kachel@xxxx.com
# Datum : 24.02.2010
# Skriptname : edit_resolv.conf
# Version : 1.0
###############
# Abfrage ob Datei vorhanden ist und die Bearbeitung der resolv.conf
#
# Variablen:
#NS_SERVER="111.11.11.1"
NS2_SERVER="222.22.22.2"
NS3_SERVER="333.33.33.3"
NS3_SERVER_ALL="nameserver 333.33.33.3"
RESOLV_CONF="/etc/resolv.conf"
DATE="`date +"%Y%m%d"`"
IFNS3="`grep -c "333.33.33.3" /etc/resolv.conf`"
AUSGABE_TAIL="`cat "${RESOLV_CONF}" | grep "nameserver" | tail -1`"
if [ -f ${RESOLV_CONF} ] ; then
cp ${RESOLV_CONF} ${RESOLV_CONF}.$DATE
sed s/${NS2_SERVER}/${NS3_SERVER}/g ${RESOLV_CONF}.$DATE > ${RESOLV_CONF}
cat ${RESOLV_CONF}
echo "..................................................................."
if [ "${IFNS3}" -gt "0" ] ; then
echo "${RESOLV_CONF} already done..............................."
else
cat /etc/resolv.conf | sed "/${AUSGABE_TAIL}/G" | sed "s/^$/nameserver 333.33.33.3/" > ${RESOLV_CONF}
cat ${RESOLV_CONF}
echo "${RESOLV_CONF} already done..............................."
fi
fi
{noformat}
Und das Script das Anhand einer Serverliste sich auf die Server über ssh einloggt und dann das Script (OBEN) kopiert, ausführt und wieder löscht.
{noformat}
#!/bin/ksh
#
###############
# Autor : Sebastian Kachel
# Mail : sebastian.kachel@xxx.com
# Datum : 10.02.2010
# Skriptname : verteiler.sh
# Version : 1.0
###############
#
#Script, dass ein Script, auf der Auswahl einer Serverliste
#auf Server kopiert, ausführt und wieder löscht.
#
#Variablen:
SERVER=$SERVER" "`cat ~/Serverlists/SOLARIS`
[ $# -eq 1 ] && SERVER=$1
for server in $SERVER ; do
ping "$server" 1 > /dev/null
ping "$server" 1 > /dev/null
ping "$server" 1 > /dev/null
if [ "$?" = "0" ]; then
echo "$server"
scp /xxx/xx/xxxxxxx/edit_resolv_conf.sh root@${server}:/var/tmp/edit_resolv_conf.sh
ssh root@${server} "sh /var/tmp/edit_resolv_conf.sh"
ssh root@${server} "rm /var/tmp/edit_resolv_conf.sh"
else
echo "...$server is dead."
fi
done
{noformat}
Aus Sicherheitsgründen sind IP und Phade durch xxx ersetzt
Nochmls einen großen Dank an euch . Echt klasse !
Liebe Grüße
OnePixel
-
26.02.10 11:32 #12
- Registriert seit
- Jun 2005
- Beiträge
- 8.168
If at first you don't succeed, try again. Then quit. No use being a damn fool about it.
Ähnliche Themen
-
Letztes Vorkommen im String entfernen
Von Dustin84 im Forum PHPAntworten: 5Letzter Beitrag: 09.11.10, 00:15 -
letztes Zeichen eines Strings auslesen
Von supercat1510 im Forum PHPAntworten: 8Letzter Beitrag: 10.07.09, 23:29 -
Excel: letztes Vorkommen eines Zeichens ersetzen: /aa/bb/cc --> /aa/bb cc
Von Kryptaesthesie im Forum Office-AnwendungenAntworten: 6Letzter Beitrag: 19.10.07, 13:20 -
Letztes Vorkommen einer Zeichenkette finden
Von 27apricot im Forum PHPAntworten: 2Letzter Beitrag: 16.10.05, 17:03 -
Letztes Vorkommen ersetzen ?
Von Hatachy im Forum PHPAntworten: 7Letzter Beitrag: 16.05.04, 00:38





Zitieren

Login





