想删除某些字符串上下的几行

时间:2016-05-06 08:16:23

标签: bash shell scripting

我的要求是从nagios文件中删除某些行

下面提到的是我的hotname.cfg文件的一部分。 我的要求是创建一个shell脚本来删除从"define host {" upto "}"开始的行 从用户获取的变量输入( read )只是可以不同的host_name。

这里我要删除与host_name相关的所有条目 - > 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
             }

我使用了几种方法来删除这样的条目,但我的算法都没有完美地运行。

3 个答案:

答案 0 :(得分:4)

这个awk单行应该适用于给定的例子:

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

想法是,将{...}块作为记录,并检查记录是否有hostname02x,我们跳过记录。

答案 1 :(得分:1)

使用sed:

/define host/

它遍历从}到下一个N的所有块:块中的每一行都被hostname02x添加到模式空间,并且删除了匹配/define host/的模式空间

说明:

  • /define host/:从:a
  • 开始
  • /}/!:即将发布的循环标签
  • }:如果找不到N ......
  • ba:将该行附加到模式空间
  • a:分支以标记}以检查下一行是否包含}
  • 当循环结束时,已找到/hostname02x/d
  • /hostname02x/:如果匹配namespace RAA_AutomationTests { using OpenQA.Selenium.Firefox; public abstract class BasePage { protected static IWebDriver driver; protected BasePage() { //cant keep creating a new driver need to change this driver = new FirefoxDriver(); } public void click(By locator) { Find(locator).Click(); } public IWebElement Find(By locator) { //ValidateSelector(locator); will update css selectors, however not to cause any extra delays by checking this programmatically. var wait = new WebDriverWait(driver, TimeSpan.FromSeconds(15)); wait.Until(ExpectedConditions.ElementIsVisible(locator)); return driver.FindElement(locator); } } }
  • ,则删除模式空间

答案 2 :(得分:0)

如果您想使用shell脚本,请尝试使用

#!/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

并将其作为

运行
./remove_host hostname.cfg host_to_remove