如何清晰识别网络物理设备与仿真设备命令输出的细微差异?
针对超长行单字符差异的比对优化方案
方案1:使用git diff的按词比对能力(最推荐,适配你的场景)
git自带的diff工具支持按自定义粒度做差异比对,刚好适配你这种逗号分隔的长规则行场景:
- 要终端高亮显示差异时使用如下命令,差异部分会直接标红标绿:
git diff --no-index --word-diff=color --word-diff-regex='[^,]+' /tmp/offline_output /tmp/online_output
- 要写入日志文件无颜色格式时,使用plain格式输出,差异会用
[-删除内容-]和{+新增内容+}明确标记:
git diff --no-index --word-diff=plain --word-diff-regex='[^,]+' /tmp/offline_output /tmp/online_output >> failure_log
以你给出的dec_ttl差异为例,输出会直接标记为actions=dec_ttl[-()-]或者actions=dec_ttl{+()+},不需要在长行里逐字符查找。
方案2:无git环境时使用wdiff工具
wdiff是专门按词做差异比对的工具,无需依赖git:
- 安装后执行如下命令,差异内容会用特殊括号标记:
wdiff /tmp/offline_output /tmp/online_output >> failure_log
- 终端查看时可以搭配colordiff实现高亮:
wdiff /tmp/offline_output /tmp/online_output | colordiff
方案3:预处理拆分长行后比对(适配网络设备规则输出专属方案)
你的输出行都是逗号分隔的键值对格式,可以先把每个逗号替换为逗号+换行,让每个配置项单独占一行,再用普通diff比对,差异项会单独成行显示,完全规避长行查找问题:
# 预处理拆分文件 sed 's/,/,\n/g' /tmp/offline_output > /tmp/offline_split sed 's/,/,\n/g' /tmp/online_output > /tmp/online_split # 比对拆分后的文件 diff -c /tmp/offline_split /tmp/online_split >> failure_log
优化后的脚本示例
你可以直接把原脚本中的diff -c替换为对应的方案命令即可,比如用git diff plain版本的修改后脚本:
diff -q /tmp/offline_output /tmp/online_output 1>/dev/null if [[ $? == "0" ]]; then echo "PASSED: $cmd" else echo "FAILED: $cmd" echo "---------------------------------" >> failure_log echo "FAILURE: $cmd " >> failure_log git diff --no-index --word-diff=plain --word-diff-regex='[^,]+' /tmp/offline_output /tmp/online_output >> failure_log echo "" >> failure_log echo "" >> failure_log fi
内容的提问来源于stack exchange,提问作者user16541120
相关产品推荐
相关产品推荐

