diff命令输出格式优化及配置文件对比异常问题求助
问题1:diff结果按配置区块分类输出
原命令用sort会打乱配置文件的区块结构,导致diff输出的区块头与对应配置行分离。可以用awk替代现有命令,先提取差异行再按区块分组整理:
解决命令
diff <(sort file1.txt) <(sort file2.txt) | grep '>' | sed 's/> *//' | awk ' /^\[.*\]$/ { block=$0; next } { lines[block] = lines[block] $0 "\n" } END { for (b in lines) { print b printf "%s", lines[b] } }'
说明
- 先通过
diff+grep+sed提取file2独有的内容 - awk识别
[xxx]格式的区块头,将后续配置行归到对应区块下 - 最终按区块输出,每个区块仅显示一次,配置行跟随对应区块
测试示例文件后,输出与预期一致:
[HT] a=24 [head] c=4 [tail] d=2
问题2:修复配置文件的重复区块与拆分行异常
针对重复的[mysqld]区块、拆分的配置行(如[mysqld].slow_query_log_file拆分为两行),用awk一次性修复:
修复命令
awk ' /^\[mysqld\]$/ { in_mysqld=1; if (!printed_block) { print; printed_block=1; next } else { next } } in_mysqld { if (/^\[.*\]$/) { in_mysqld=0; print; next } if (prev_line ~ /^\[mysqld\]\./) { sub(/^\[mysqld\]\./, "", prev_line) $0 = prev_line $0 gsub(/\n/, ".", $0) prev_line = "" print $0 } else if (/\.$/ || /[^']$/) { prev_line = $0 } else { print $0 } } !in_mysqld { print } ' your_config_file.txt
说明
- 仅打印一次
[mysqld]区块头 - 识别以
[mysqld].开头的拆分行,拼接为完整配置行并将换行替换为. - 处理跨换行的配置值(如拆分的文件路径),拼接后补全格式
测试错误示例后,输出修正后的内容:
[mysqld] max_connections=200 max_user_connections=300 slow_query_log query_cache_size=0 ignore_db_dir slow_query_log_file='/home/slow_query.log'
内容的提问来源于stack exchange,提问作者Raj
相关产品推荐
相关产品推荐

