You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 10:21:28