我的要求是从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
}
我使用了几种方法来删除这样的条目,但我的算法都没有完美地运行。
答案 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