Bash脚本需求:跨目录同名文件contact*行的更新与追加
解决方案
我来给你一个可靠的实操方案——刚好之前处理过类似的Nagios配置同步需求,核心思路是先清理目标文件中已有的contact*相关行,再将源文件的对应行追加进去,这样既能替换旧的配置,也能在目标文件原本没有这类行时完成追加。
假设你的同名文件是your_file.cfg(记得替换成你实际的文件名),具体步骤如下:
1. 先备份目标文件(必须做!防止操作失误)
cp /usr/local/nagios/etc/services/your_file.cfg /usr/local/nagios/etc/services/your_file.cfg.bak
2. 执行更新/追加核心命令
这条命令会先删除目标文件里所有包含contact的行(如果是严格以contact开头的行,后面会说调整方法),然后把源文件里的contact*行追加进去:
# 先删除目标文件的contact相关行,再追加源文件的对应行 sed -i '/contact/d' /usr/local/nagios/etc/services/your_file.cfg && grep 'contact' /usr/local/nagios/etc/hosts/your_file.cfg >> /usr/local/nagios/etc/services/your_file.cfg
命令细节调整:
- 如果你的
contact行是严格以contact开头(没有前置空格),可以把正则改成^contact来精准匹配,避免误删其他包含contact的行:sed -i '/^contact/d' /usr/local/nagios/etc/services/your_file.cfg && grep '^contact' /usr/local/nagios/etc/hosts/your_file.cfg >> /usr/local/nagios/etc/services/your_file.cfg - 如果行前面有空格或制表符,用
[[:space:]]*contact来匹配带空白前缀的行:sed -i '/[[:space:]]*contact/d' /usr/local/nagios/etc/services/your_file.cfg && grep '[[:space:]]*contact' /usr/local/nagios/etc/hosts/your_file.cfg >> /usr/local/nagios/etc/services/your_file.cfg
3. 验证操作结果
用下面的命令对比源文件和目标文件的contact行是否一致:
diff <(grep 'contact' /usr/local/nagios/etc/hosts/your_file.cfg) <(grep 'contact' /usr/local/nagios/etc/services/your_file.cfg)
如果没有任何输出,说明两行完全一致,操作成功。
额外提醒:
- 操作前的备份一定要做,万一正则写错误删了其他配置,直接恢复备份文件就行
- 如果是批量处理多个同名文件,可以用循环命令,比如:
for file in /usr/local/nagios/etc/hosts/*.cfg; do filename=$(basename "$file") cp "/usr/local/nagios/etc/services/$filename" "/usr/local/nagios/etc/services/$filename.bak" sed -i '/^contact/d' "/usr/local/nagios/etc/services/$filename" && grep '^contact' "$file" >> "/usr/local/nagios/etc/services/$filename" done
内容的提问来源于stack exchange,提问作者MarkG
相关产品推荐
相关产品推荐

