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

R

Ritter

Grünschnabel
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.
 
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
 
@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.
 
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
 
Zuletzt bearbeitet:
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
 
Nochmals herzlichen Dank an SMG und Fallout für die rasche und kompetente Hilfe. ;-)

Mit folgendem sed-script hat es perfekt funktioniert:

#!/usr/bin/sed
/^[ \t]*check_command[ \t]*/a\\tcheck_period\t\t24x7 \
check_interval\t\t3 \
obsess_over_host\t0 \
check_freshness\t\t0 \
event_handler_enabled\t\1 \
flap_detection_enabled\t1 \
process_perf_data\t1 \
retain_status_information\t1 \
retain_nonstatus_information\t1 \
active_checks_enabled\t1 \
passive_checks_enabled\t1

Aufruf:

sed -f script.sed hosts.cfg > new_hosts_4_import.cfg

Grüße,

R.

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

Ähnliche Themen

dovecot und postfix Konfiguration Problem

Erklärung Samba-Optionen valid users, read -und write list

XFCE freezes at startup

Squid nur zum maskieren der eigenen IP, nicht für Webserver auf port 80

Apache zu langsam ?

Zurück
Oben