Sed / Awk скрипт для добавления / вставки? - PullRequest
0 голосов
/ 20 октября 2011

У меня есть файл конфигурации, который выглядит как пример ниже.Существует ряд определений, сгруппированных по имени хоста.Я только что добавил определение "cpu-service" к одному хосту "mothership".Теперь мне нужно сделать это на 100+ больше в том же файле.То, что я уже сделал, вычеркнул из конфигурационного файла все существующие имена хостов (более 100).Итак, теперь у меня есть файл со списком серверов, которые теперь должны иметь комментарий определения службы cpu.У них уже есть ping-сервис, поэтому я просто хочу добавить cpu-сервис к каждому.Очевидно, что делать это вручную вручную было бы утомительно.

Есть ли скрипт sed / awk, который я мог бы использовать для выполнения этого типа работы.По сути, мне нужно написать файл skel с определяемой частью и оставить host_name пустым.Затем введите туда файл host.txt.Я мог бы, возможно, взломать это с некоторой хитростью VI также.Не уверены?

Заранее спасибо!


define{
        use                             cpu-service
        host_name                       mothership
        contact_groups                  systems manager
}
define{
        use                             ping-service
        host_name                       mothership
        contact_groups                  systems manager
}

Ответы [ 3 ]

1 голос
/ 20 октября 2011

Несмотря на то, что у меня появилось небольшое чувство, что я выполняю вашу работу, попробуйте следующий сценарий:

 awk '
 BEGIN {
         RS = ORS = "}\n"
         FS = "\n"
 }
 NF > 0 {
         print
         if (sub(/ping-service/, "cpu-service")) print
 }
 ' file

Один компромисс: каким-то образом я получаю трейлинг "}", но об этом не стоит беспокоиться, если вы не получиличтобы делать это каждый день - просто удалите его с помощью редактора.

Как всегда с awk : если ваш поставщик отправляет историческую версию awk , вы можете использовать nawk .

1 голос
/ 20 октября 2011

Три шага господин:

1: файл имени хоста (hostnames.txt)

mothership
motherload
motherofpeal
mothersbaugh

2скрипт (hostup.sh)

#!/bin/bash

HOSTNAME=$1

TEMPLATE=" 
define{
        use                             cpu-service
        host_name                       ${HOSTNAME}
        contact_groups                  systems manager
}
define{
        use                             ping-service
        host_name                       ${HOSTNAME}
        contact_groups                  systems manager
}"

echo "${TEMPLATE}"

3: командная строка

chmod + x hostup.sh
во время чтения имени;do hostup.sh $ name;сделано во время чтения имени;do hostup.sh $ name;done > hosts.conf

1 голос
/ 20 октября 2011

Sed может вставлять символы новой строки, просто экранировать их обратной косой чертой - например, следующее будет проходить через каждую строку в вашем файле 'hosts' и заменять ее полным определением для службы cpu.Я не уверен, что это именно то, что вам нужно.

sed -e 's/^(.*)$/define{\
    use                             cpu-service\
    host_name                       \1\
    contact_groups                  systems manager\
}/g' hosts.txt > new_directives

, если вас устраивают new_directives, тогда вы можете просто

cat new_directives >> config_file

ПРИМЕЧАНИЕ. У вас могут возникнуть проблемы с пробелом /завершающие символы новой строки.

...