linux从入门到精通读薄(五)cmp/comm/diff

5-3-2 比较文件内容

cmp可以检查两个文件是否是同一文件,它的做法是:对两个文件的内容按字节进行比较,直到发现差别或者文件结束。

它的格式:

cmp file1 file2

可以用“~”代替file1或file2当中的一个,那么被代替的文件的正文将从标准输入设备取得。如果没有使用重新定向,那就从键盘输入。

cmp命令的输出是两个文件不同的第1个字节和行号。


如果文件的行已经被排序,则可以用comm命令:

comm options file1 file2

如果没有指定options,comm的输出分三列显示:
file1有但file2没有的行显示在第1列;
file2有但file1没有的行显示在第2列;
都有的显示的行显示在第3列;

[试验]

对pw.test排序,将结果送给pw1.test:

$ sort pw.test -o pw1.test
$ cat pw1.test
carey:esJ9ohd8HH89i:501:50::/usr1/carey:/bin/bash
grex:cj8AjoWE8h8fs:1500:60::/usr1/mot:/bin/sh
mot:dhjd83kjdJS6D:1500:60::/usr1/mot:/bin/bash
pc:bdhd74hs9jh3h:50:50::/usr1/pc:/bin/bash
root:awmku76tr43d6:0:0::/root/:/bin/sh

修改pw.test的一些行,对结果排序,然后送到pw2.test:

$ sed /pc/,/carey/s/bash/sh/ <pw.test | sort >pw2.test
carey:esJ9ohd8HH89i:501:50::/usr1/carey:/bin/sh
grex:cj8AjoWE8h8fs:1500:60::/usr1/mot:/bin/sh
mot:dhjd83kjdJS6D:1500:60::/usr1/mot:/bin/bash
pc:bdhd74hs9jh3h:50:50::/usr1/pc:/bin/sh
root:awmku76tr43d6:0:0::/root/:/bin/sh

用comm比较pw1.test和pw2.test:

$ comm pw1.test pw2.test
carey:esJ9ohd8HH89i:501:50::/usr1/carey:/bin/bash
carey:esJ9ohd8HH89i:501:50::/usr1/carey:/bin/sh
grex:cj8AjoWE8h8fs:1500:60::/usr1/mot:/bin/sh
mot:dhjd83kjdJS6D:1500:60::/usr1/mot:/bin/bash
pc:bdhd74hs9jh3h:50:50::/usr1/pc:/bin/bash
pc:bdhd74hs9jh3h:50:50::/usr1/pc:/bin/sh
root:awmku76tr43d6:0:0::/root/:/bin/sh

可以用-1,-2,-3抑止相应列的输出,如只看出现在pw1.test而没出现在pw2.test中的行:

$ comm -2 -3 pw1.test pw2.test
carey:esJ9ohd8HH89i:501:50::/usr1/carey:/bin/bash
pc:bdhd74hs9jh3h:50:50::/usr1/pc:/bin/bash


另一个用来比较文件内容的主要命令是diff。它完成更复杂的检查,对两个文件进行系统的检查,不要求事先排序,并显示所有不同的行:

$ diff pw1.test pw2.test
1c1
<
carey:esJ9ohd8HH89i:501:50::/usr1/carey:/bin/bash
----
>carey:esJ9ohd8HH89i:501:50::/usr1/carey:/bin/sh
……
输出中带小于符号的行出现在第1个文件中,而没有出现在第2个文件中;带大于符号的行出现在第2文件中而没有出现在第1文件中。

(待续)