我有一个配置文件,如下例所示。有一系列按主机名分组的定义。我刚刚将“cpu-service”定义添加到一个主机“motherhip”中。现在我需要在同一个文件中再多做100多个。我已经完成的工作是从配置文件中删除所有预先存在的主机名(100+)。所以现在我有一个文件,其中包含现在需要让cpu-service定义注释的服务器列表。他们已经有ping服务,所以我只想为每个人添加cpu-service。显然,手动手动操作将是乏味的。
是否有可用于执行此类工作的sed / awk脚本。基本上我需要用define部分写一个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
}
答案 0 :(得分:1)
Sed可以插入换行符,只需反斜杠转义它们 - 例如以下内容将遍历“hosts”文件中的每一行,并将其替换为cpu-service的完整定义。我不确定这是不是你想要的。
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
注意您可能会遇到空白/尾随换行问题。
答案 1 :(得分:1)
虽然我对你的工作有轻微的感觉,但请尝试以下脚本:
awk '
BEGIN {
RS = ORS = "}\n"
FS = "\n"
}
NF > 0 {
print
if (sub(/ping-service/, "cpu-service")) print
}
' file
一个权衡:不知怎的,我得到一个尾随“}”,但不值得担心,除非你每天都要这样做 - 只需用编辑器删除它。
与 awk 一样:如果您的供应商提供 awk 的历史版本,您可能需要使用 nawk 。
答案 2 :(得分:1)
先生三步:
1:主机名文件(hostnames.txt)
母船
motherload
motherofpeal
motherbaugh
2:script(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;完成< hostnames.txt
而读名; do hostup.sh $ name;完成< hostnames.txt>> hosts.conf