linux - BASH - 比较两个文件并将输出重定向到可读的内容

标签 linux bash diff

我需要对服务器上的两个文件进行比较,并让输出包含 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/

相关文章:

powershell - 仅比较对象左侧或右侧

asp.net - 网站/Web 服务部署环境不同/监控?

java - 从 Java Swing GUI 调用 native C 代码

linux - 在 Ubuntu 上通过物理网络向自己发送流量

bash - ed HERELINE 替代模式失败

linux - 可执行的 while 循环 : no such file or directory

git - 在 git 中显示两个提交的非 merge 差异

c - kprintf 打印出正楷

php - 如何停止正在监听 http ://127. 0.0.1:8000 的 symfony 进程

linux - 在 bash 中查找非常大的文本文件中的重复条目