我需要对服务器上的两个文件进行比较,并让输出包含 header 或其他一些指示,以说明差异所在。
脚本当前运行命令列表并根据输出创建文件。输出类似于此:
Device 1
Register A value1
Register B value2
Register C value4
...
Register H value5
Device 2
Register A value1
Register B value2
Register C value4
...
Register H value5
每天午夜,cron 将运行此脚本并使用当前设备及其寄存器设置创建第二个文件,因此我可以比较前几天的寄存器 - 当前使用:
diff -u file1.txt file2.txt > filediff.txt
如果 filediff.txt 为空,它会删除 diff,并将 file1.txt 移动到 file2.txt 并删除 file1.txt,所以我只剩下 file1.txt。
如果 filediff.txt 文件不为空,我会得到类似于以下内容的输出:
-Register B value2
+Register B value3
问题是这样的:由于 diff 输出的长度,我丢失了有差异的设备名称,除非该差异接近设备名称。有没有我可以添加到 diff 命令的标志,或者检查两个文件之间差异的不同方法,这将包括更多或全部寄存器值,以便我可以获取设备名称和寄存器更改(旧和新的)所以我可以将它们放入文本文件中进行报告:
Device 1
Old Register R value18
New Register R value23
最佳答案
只是想一想,用 awk 进行后处理怎么样
diff -u file1.txt file2.txt | \
awk -F ' ' '( DEVICE_VAR ~ "" && $1 == "Device"){print DEVICE_VAR "\nOld " FILE1_VAR "\nNew " FILE2_VAR; FILE1_VAR = ""; FILE2_VAR = ""}
( $1 == "Device"){DEVICE_VAR = $0}
( $1 == "-Register"){FILE1_VAR = FILE1_VAR " | " $0 }
( $1 == "+Register"){FILE2_VAR = FILE2_VAR " | " $0 }
END {print DEVICE_VAR "\nOld " FILE1_VAR "\nNew " FILE2_VAR}'
文件1.txt:
Device 1
Register A value1
Register B value2
Register C value4
Device 2
Register A value1
Register B value2
Register C value4
文件2.txt:
Device 1
Register A value6
Register B value7
Register C value8
Device 2
Register A value4
Register B value4
Register C value6
输出:
Old
New
Device 1
Old | -Register A value1 | -Register B value2 | -Register C value4
New | +Register A value6 | +Register B value7 | +Register C value8
Device 2
Old | -Register A value1 | -Register B value2 | -Register C value4
New | +Register A value4 | +Register B value4 | +Register C value6
关于linux - BASH - 比较两个文件并将输出重定向到可读的内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22866254/