2 个字符串可以轻松地进行比较test
或[[ ... ]]
类似将字符串与正则表达式进行比较
例如
wolf@linux:~$ var1=`grep 'trap2sink 127.0.0.7 w0rd' snmpd.conf`
wolf@linux:~$
wolf@linux:~$ if [[ $var1 = 'trap2sink 127.0.0.7 w0rd' ]]; then
> echo Good
> else
> echo Bad
> fi
Good
wolf@linux:~$
包含几行的某些配置集怎么样?
目的是确保所有设备中的每一项配置都遵循标准。
假设这是 snmpd.conf 的标准。让我们命名这个snmpd.conf.standard
trap2sink 127.0.0.7 w0rd
rocommunity P@55 127.0.0.1
rocommunity 4nyth1ng 127.0.0.9
这是设备 X 的示例配置。我们将其命名为snmpd.conf
*** some random data here and there ***
rocommunity P@55 127.0.0.1
rocommunity 4nyth1ng 127.0.0.9
trap2sink 127.0.0.7 w0rd
*** some random data here and there ***
比较这两个配置的最佳方法是什么?
由于有几行数据,我不确定是否grep
可以在这种情况下使用,然后是if ... else
语句。
if [[ ... config matches ... ]]; then
echo Good
else
echo Bad
fi
请让我知道解决此类问题的最佳方法是什么。
更新 1 由比尔·杰泽(它有效......我将用一些实际数据进行测试并分享输出)
wolf@linux:~$ cat snmpd.conf
*** some random data here and there ***
rocommunity P@5s 127.0.0.1
rocommunity 4nyth1ng 127.0.0.9
trap2sink 127.0.0.7 w0rd
*** some random data here and there ***
wolf@linux:~$
wolf@linux:~$ cat snmpd.conf.standard
trap2sink 127.0.0.7 w0rd
rocommunity P@55 127.0.0.1
rocommunity 4nyth1ng 127.0.0.9
wolf@linux:~$
wolf@linux:~$ ptn='^(rocommunity|trap2sinc) ';
wolf@linux:~$ diff <(grep -E "$ptn" snmpd.conf | sort) <(grep -E "$ptn" snmpd.conf.standard | sort);
2c2
< rocommunity P@5s 127.0.0.1
---
> rocommunity P@55 127.0.0.1
wolf@linux:~$
答案1
ptn='^(rocommunity|trap2sinc) ';
diff <(grep -E "$ptn" file1| sort) <(grep -E "$ptn" file2| sort);
如果它没有返回任何内容,那么这些行对于两个文件都是通用的。
答案2
您可以通过对文件进行校验和并对输出进行排序来一次比较任意数量的文件。这会将所有相同的文件分组在一起,以便您可以发现叛徒。man cksum
Diff 的输出相当晦涩,需要熟练的眼睛才能理解。它实际上发出一组命令(如ed
命令所使用的),将 file1 转换为 file2。
有一个变体sdiff
可以并排显示文件,这更容易理解。man sdiff
由于您确实有一个“标准”文件,因此只需先对该文件进行 cksum,然后对所有文件进行 cksum 并使用 grep -v 查找不同的文件。
或者,确保文件完全相同的最简单方法是将标准复制到所有其他文件上。
答案3
如果想法是拥有一个可以自动化的流程,例如在 shell 脚本中,那么 Bill Jetzer 和 Paul_Pedant 的基于控制台的答案可能是最好的方法。
如果您想“通过眼睛”检查它们,您可能需要尝试meld
,这是一个类似于 Windows 下的“BeyondCompare”的图形工具,并以一种相当容易访问的方式显示文本文件之间的差异。