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

使用Bash脚本合并两台服务器同目录下同名日志文件

嘿,我来帮你搞定这个跨服务器合并同名日志文件的需求,下面是一个实用的Bash脚本方案,附带详细注释和使用说明,你可以直接套用~

跨服务器合并同名日志文件的Bash脚本方案

核心思路

我们以server1作为操作起点,遍历它的目标目录结构,找到所有日志文件后,对应匹配server2上的相同路径文件,将两者合并到指定位置(这里提供了两种合并方式,你可以按需选择)。

前提条件

  • 两台服务器之间必须配置免密SSH登录:这样脚本才能无交互执行远程命令,不会中途卡住要输入密码。如果还没配置,执行ssh-keygen生成密钥对,再用ssh-copy-id server2把公钥复制到server2即可。
  • 两台服务器的目录结构完全一致,确保/var/logs/linux/[IP]/detail-[日期]的路径能一一对应。

完整Bash脚本

#!/bin/bash

# 配置参数,根据你的实际情况修改
REMOTE_SERVER="server2"          # 远程服务器名称/IP
BASE_DIR="/var/logs/linux"       # 日志根目录
MERGE_SUFFIX=".merged"           # 合并后文件的后缀,避免覆盖原文件

# 遍历server1上所有符合命名规则的日志文件
find "$BASE_DIR" -type f -name "detail-*" | while read -r LOCAL_FILE; do
    # 对应远程服务器上的相同文件路径
    REMOTE_FILE="$LOCAL_FILE"
    
    # 先检查远程服务器上是否存在该文件
    if ssh "$REMOTE_SERVER" [[ -f "$REMOTE_FILE" ]]; then
        echo "正在合并: $LOCAL_FILE ↔ $REMOTE_SERVER:$REMOTE_FILE"
        
        # 选项1:将远程文件追加到server1的原文件中(会修改原文件)
        # ssh "$REMOTE_SERVER" cat "$REMOTE_FILE" >> "$LOCAL_FILE"
        
        # 选项2:生成带后缀的新合并文件,保留原文件(推荐,更安全)
        cat "$LOCAL_FILE" <(ssh "$REMOTE_SERVER" cat "$REMOTE_FILE") > "${LOCAL_FILE}${MERGE_SUFFIX}"
        
        echo "合并完成!结果文件:${LOCAL_FILE}${MERGE_SUFFIX}"
    else
        echo "⚠️ 警告:远程服务器$REMOTE_SERVER上找不到$REMOTE_FILE,跳过该文件"
    fi
done

echo "✅ 所有合并操作已执行完毕"

关键细节说明

  • 文件遍历:用find命令精准匹配以detail-开头的日志文件,避免误操作其他类型文件。
  • 远程校验:通过ssh执行远程文件存在性检查,防止尝试合并不存在的文件导致报错。
  • 合并方式:
    • 选项1直接追加到原文件,适合需要直接更新原日志的场景;
    • 选项2生成新文件,保留原文件内容,方便后续对比排查,推荐优先使用。
  • 容错性:遇到远程文件不存在的情况,脚本只会输出警告并跳过,不会中断整个任务流程。

扩展优化建议

  • 如果需要将合并结果保存到server2,只需要调换本地和远程的逻辑,修改合并后的文件路径指向server2即可。
  • 可以添加日志记录功能,把整个合并过程写入一个日志文件(比如merge_logs_$(date +%Y%m%d).log),方便后续追溯问题。
  • 针对超大日志文件,可以改用rsync先同步文件再合并,或者用ssh结合dd提升传输效率,不过普通日志文件用cat就足够高效。

内容的提问来源于stack exchange,提问作者Abobaker EngIt

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 22:42:39