编写Bash脚本实现指定顺序的动态日志文件合并
批量合并编号日志文件的Bash脚本
需求说明
我的文件夹中有以下格式的日志文件:
messages messages.1 messages.2 messages.3 messages.4 messages.5 messages.6 messages.7
需要按从最旧到最新的顺序合并成单个文件(比如log.txt),顺序为:messages.7 → messages.6 → messages.5 → messages.4 → messages.3 → messages.2 → messages.1 → messages
之前手动执行的命令是:
cat messages.7 >> log.txt cat messages.6 >> log.txt cat messages.5 >> log.txt cat messages.4 >> log.txt cat messages.3 >> log.txt cat messages.2 >> log.txt cat messages.1 >> log.txt cat messages >> log.txt
现在需要编写一个通用Bash脚本,处理任意数量符合该命名规则的文件(messages是最新日志,带最大编号的messages.N是最旧日志,无需反转文件内容)。
通用Bash脚本
#!/bin/bash # 定义输出文件名 OUTPUT_FILE="log.txt" # 清空已存在的输出文件(避免重复追加内容) > "$OUTPUT_FILE" # 获取所有带编号的messages文件,按编号从大到小排序 sorted_files=$(ls messages.* 2>/dev/null | awk -F. '{print $2, $0}' | sort -nr | awk '{print $2}') # 先合并所有编号文件(从最旧到较新) for file in $sorted_files; do cat "$file" >> "$OUTPUT_FILE" done # 最后合并最新的messages文件 cat messages >> "$OUTPUT_FILE" echo "合并完成,结果已保存到$OUTPUT_FILE"
脚本说明
ls messages.* 2>/dev/null:列出所有带后缀的messages文件,2>/dev/null用于屏蔽“无匹配文件”的错误提示awk -F. '{print $2, $0}':以.为分隔符,提取文件的编号和完整文件名sort -nr:对编号进行逆序排序(从大到小),保证最旧的文件优先被合并- 循环遍历排序后的文件,依次追加到输出文件
- 最后追加最新的
messages文件,完成完整的合并流程
简化单行命令
如果不需要额外的提示信息,也可以用一行命令直接完成:
cat $(ls messages.* 2>/dev/null | awk -F. '{print $2, $0}' | sort -nr | awk '{print $2}') messages > log.txt
内容的提问来源于stack exchange,提问作者Nishil Shah
相关产品推荐
相关产品推荐

