2016-05-06 3 views
0

Моего требования, чтобы удалить определенные строки из моего файла nagiosЕсли вы хотите удалить несколько строк выше и ниже определенной строки

Ниже упомянут является частью моего hotname.cfg файла. Мое требование состоит в том, чтобы сделать сценарий оболочки для удаления строк, начинающихся с "define host {" upto "}" , а переменный ввод (read) для извлечения из пользователя - это просто имя_хоста, которое может отличаться.

здесь я хочу, чтобы удалить все записи, относящиеся к имя_хосту -> hostname02x поэтому необходимо удалить записи, относящиеся к нему, начиная с "define host {" upto "}", так что файл, который ранее выглядеть

#cat hostname.cfg 

define host{ 
       use      linux-server   ; Name of host template to use 
       host_name    hostname01x 
       hostgroups    COT-Servers 
       contact_groups   admins 
       alias     FEA Preprod 
      } 

define host{ 
       use      linux-server   ; Name of host template to use 
       host_name    hostname02x 
       hostgroups    COT-Servers 
       contact_groups   admins 
       alias     Grid Engine 
       } 

выглядит .. .

#cat hostname.cfg 

define host{ 
       use      linux-server   ; Name of host template to use 
       host_name    hostname01x 
       hostgroups    COT-Servers 
       contact_groups   gecotadmins 
       alias     FEA Preprod 
      } 

Я использовал несколько методов для удаления такой записи, но ни один из моих алгоритмов не работает отлично.

ответ

1

С СЭД:

sed '/define host/ {:a;/}/!{N;ba};/hostname02x/d}' hotname.cfg 

Он перебирает все блоки из /define host/ Шифрование до следующего }: каждая строка в блоке добавляется в шаблон пространстве с N и соответствие шаблон пространство hostname02x удаляется.

Объяснение:

  • /define host/: начиная с /define host/
  • :a: метки для предстоящего цикла
  • /}/!: если } не найден ...
  • N: добавьте строку к узорное пространство
  • ba: отрасль на этикетке a, чтобы проверить, если следующая строка содержит }
  • когда концы петли, } было найдено
  • /hostname02x/d: удаляет шаблон пространство, если оно соответствует /hostname02x/
+0

Хотя параметр -i отсутствовал, но я понял это как im тоже «Seeder» sed -i.bak '/ define host/{: a; /} /! {N; ba};/hostname02x/d} «hotname.cfg отлично работает для меня ... Приветствия теперь будут переданы скрипту PHP;) –

+0

вы можете подробнее рассказать о параметрах/define host/{: a; /} /! {N; ba} ;/hostname02x/d} ' –

+0

@ KunalSaha Я обновил свой ответ. – SLePort

4

это AWK один вкладыш должен работать на данном примере:

awk -v RS="[}]\n" -v ORS="}\n" '!/hostname02x/' hostname.cfg 

Идея заключается в том, сделать {...} блок в качестве записи, и проверить, если запись имеет hostname02x, мы пропускаем запись.

+0

Kent, он просто grep выводит, но не удаляет из файла. –

+0

@KunalSaha вам нужно перенаправить, как этот 'awk '...' hn.cfg>/tmp/foo && mv/tmp/foo hn.cfg' дать ему попробовать – Kent

+0

grep -A3 -B3 hostname02x hostname.cfg дает то же самое но не может перенаправить необходимый. –

0

Если вы хотите использовать скрипт, попробуйте это

#!/bin/bash 
awk -v hostname=$2 'BEGIN{RS="}\n"}!($0~hostname) {if($0!="\n"){printf "%s}\n",$0}}' $1 >tempfile.cfg 
mv tempfile.cfg $1 

Сохраните сценарий как, скажем, remove_host

и г un it as

./remove_host hostname.cfg host_to_remove 
Смежные вопросы