Nach jedem match (regex) eine zusätzliche Zeile mit Text einfügen

Dieses Thema im Forum "Shell-Skripte" wurde erstellt von Ritter, 24.07.2007.

  1. Ritter

    Ritter Grünschnabel

    Dabei seit:
    01.02.2007
    Beiträge:
    6
    Zustimmungen:
    0
    Hallo,

    wie fügt man (mittels sed / awk / perl) nach jedem matching String eine Zeile mit Text ein?

    Hintergrund: Ich habe eine (Nagios)Konfigurationsdatei mit unzähligen Hosts und möchte jedem Host weitere Optionen zuweisen.

    Beispiel (ist Zustand):

    Code:
    define host{
            host_name               1stDNS
            alias                   Primary DNS Server
            address                 84.34.xx.yy
            max_check_attempts      10
            notification_interval   120        
            }
    Beispiel (soll Zustand):

    Code:
    define host{
            host_name               1stDNS
            alias                   Primary DNS Server
            address                 84.34.xx.yy
    [COLOR="Blue"][B]        check_command           check_icmp[/B][/COLOR]
            max_check_attempts      10
            notification_interval   120        
            }
    Es soll also nach jeder Zeile mit "address" eine neue Zeile mit "check_command check_icmp" eingefügt werden.

    Wie macht man das am geschicktesten? Noch besser, wie fügt man mehrere Zeilen nach einem Treffer hinzu?

    Grüße,

    R.
     
  2. Anzeige

    Schau dir mal diese Kategorie an. Dort findest du bestimmt etwas.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  3. #2 Fallout, 24.07.2007
    Fallout

    Fallout Doppel-As

    Dabei seit:
    02.03.2007
    Beiträge:
    120
    Zustimmungen:
    0
    Hi,

    mit sed müßte es so gehen (kurzer Test bei mir mit GNU bash, version 3.1.17(1)-release war erfolgreich):

    Code:
    sed '/^[ \t]*address[ \t]*/a\\tcheck_command\t\tcheck_icmp' old_file > new_file
    Zur Übersicht: sed '/MUSTER/aNeuerAnzuhaengenderText' input

    Um die Fehltreffer möglichst gering zu halten, kannst Du den RegEx für Deine address-Zeilen noch um ein brauchbares IP-Adressen-Muster erweitern.

    Gruß Daniel
     
  4. Ritter

    Ritter Grünschnabel

    Dabei seit:
    01.02.2007
    Beiträge:
    6
    Zustimmungen:
    0
    @Fallout:

    Respekt. Lösung in "Echtzeit" gepostet die funktioniert!

    Der Übersichtlichkeit wegen würde ich es lieber als Scriptfile für sed definieren. So kann ich dann auch mehrere Zeilen an den Matching String appenden. Hast Du hierfür auch ein Beispiel? Keine Sorge, das war es dann auch schon. :-)

    Grüße,

    R.
     
  5. #4 smg, 24.07.2007
    Zuletzt bearbeitet: 24.07.2007
    smg

    smg Regex Fetischist

    Dabei seit:
    20.05.2007
    Beiträge:
    195
    Zustimmungen:
    0
    Ort:
    /home/stephan/
    Hängt nach dem Treffer an:
    sed '/regex_to_match/aTEXT' old_file > new_file && mv new_file old_file
    Schreibt vor den Treffer:
    sed '/regex_to_match/iTEXT' old_file > new_file && mv new_file old_file

    Hast du GNU Sed?
    Code:
    stephan@unimatrix ~ :) $ cat script.sed 
    #!/usr/bin/env sed
    sed -i '/^[ \t]*address[ \t]*/a\\tcheck_command\t\tcheck_icmp'
    sed -f script.sed old_file
    
    Falls kein GNU Sed:
    Code:
    stephan@unimatrix ~ :) $ cat script.sed 
    #!/usr/bin/env sed
    sed -i '/^[ \t]*address[ \t]*/a\\tcheck_command\t\tcheck_icmp'
    sed -f script.sed old_file > new_file && mv new_file old_file
    
     
  6. Ritter

    Ritter Grünschnabel

    Dabei seit:
    01.02.2007
    Beiträge:
    6
    Zustimmungen:
    0
    Yepp.

     
  7. Anzeige

    Vielleicht findest du HIER Antworten.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  8. smg

    smg Regex Fetischist

    Dabei seit:
    20.05.2007
    Beiträge:
    195
    Zustimmungen:
    0
    Ort:
    /home/stephan/
    Dann:
    Code:
    cat > my_script.sed
    #!/usr/bin/env sed
    sed -i '/^[ \t]*address[ \t]*/a\\tcheck_command\t\tcheck_icmp'
    ^D (CTRL-D)
    Danach:
    Code:
    sed -f my_script.sed my_file
     
  9. Ritter

    Ritter Grünschnabel

    Dabei seit:
    01.02.2007
    Beiträge:
    6
    Zustimmungen:
    0
    Nochmals herzlichen Dank an SMG und Fallout für die rasche und kompetente Hilfe. ;-)

    Mit folgendem sed-script hat es perfekt funktioniert:

    Aufruf:

    Grüße,

    R.

    P.S.: Sensationell gutes Board hier!!!
     
Thema:

Nach jedem match (regex) eine zusätzliche Zeile mit Text einfügen

Die Seite wird geladen...

Nach jedem match (regex) eine zusätzliche Zeile mit Text einfügen - Ähnliche Themen

  1. Skript bei Lubuntu nach jedem Start ausführen

    Skript bei Lubuntu nach jedem Start ausführen: Hallo, durch neue Hardware musste ich das OS (Lubuntu) neu installieren. Vorher hatte ich mal ein Autostart-Skript eingerichtet, das bei jedem...
  2. Amarok stoppt nach jedem Stück

    Amarok stoppt nach jedem Stück: Hallo zusammen, Ich habe kürzlich von 10.04 lts auf Kubuntu 12.04 lts aktualisiert, Amarok wurde dementsprechend mitaktualisiert. Erst hat alles...
  3. Welches Script wird nach jedem Login eines Users ausgeführt?

    Welches Script wird nach jedem Login eines Users ausgeführt?: Morgen! Hab da mal son Anliegen. Habe mehrere User eingetragen..... eigentlich normale Benutzer...... Denen soll bei meiner Slackware 10.2 der...
  4. Soundkarte nach jedem Neustart neu installieren

    Soundkarte nach jedem Neustart neu installieren: Hallo, habe folgendes Problem: Ich habe eine Creative Soundblaster Audio PCI128 Soundkarte, und muss sie nach jedem Neustart neu installieren...
  5. Yast muss nach jedem Neustart die Netzwerkeinstellungen nochmal bestätigt kriegen...

    Yast muss nach jedem Neustart die Netzwerkeinstellungen nochmal bestätigt kriegen...: Hi, ja, also nach jedem Neustart einfach nochmal den Dialog für "wlan0" durchklicken. Erst dann funktioniert das Internet. Hab das ganze über...