cmp 命令:比较任意两个类型的文件,且吧结果输出到标准输出,默认文件相同不输出,不同的文件输出差异

必要参数

-c 显示不同的信息
-l 列出所有的不同信息
-s 错误信息不提示
 选择参数

-i<字符数> 指定字符数目
-v 显示版本信息
--help 显示帮助信息

【函数的返回值】

0 :文件时同样的
1 :文件是不同的
>1:发生错误

comm将逐行比较已经排序的两个文件。显示结果包括3列:

第1列为只在file1中找到的行;第2列为只在file2中找到的行;第3列为两个文件的公用行。

参数

参数file1file2comm要比较的文件的路径名。用连字符(-)来替代file1或者file2时,comm将从标准输入读取输入信息

选项

-1              不显示第1列(即不显示只在file1中找到的行)

-2              不显示第2列(即不显示只在file2中找到的行)

-3              不显示第3列(即不显示在两个文件中都找到的行)

注意

如果文件没有排序,comm就不能正常的工作

第2列的没一行前面有一个制表符,第3列中的每一行前面有两个制表符

diff 命令是 linux上非常重要的工具,用于比较文件的内容,特别是比较两个版本不同的文件以找到改动的地方。diff在命令行中打印每一个行的改动。最新版本的diff还支持二进制文件。diff程序的输出被称为补丁 (patch),因为Linux系统中还有一个patch程序,可以根据diff的输出将a.c的文件内容更新为b.c。diff是svn、cvs、git等版本控制工具不可或缺的一部分。

diff 命令能比较单个文件或者目录内容。如果指定比较的是文件,则只有当输入为文本文件时才有效。以逐行的方式,比较文本文件的异同处。如果指定比较的是目录的 的时候,diff 命令会比较两个目录下名字相同的文本文件。列出不同的二进制文件、公共子目录和只在一个目录出现的文件。

3.命令参数:

-  指定要显示多少行的文本。此参数必须与-c或-u参数一并使用。

 -a或--text  diff预设只会逐行比较文本文件。

-b或--ignore-space-change  不检查空格字符的不同。

-B或--ignore-blank-lines  不检查空白行。

-c  显示全部内文,并标出不同之处。

-C或--context  与执行"-c-"指令相同。

-d或--minimal  使用不同的演算法,以较小的单位来做比较。

-D或ifdef  此参数的输出格式可用于前置处理器巨集。

-e或--ed  此参数的输出格式可用于ed的script文件。

-f或-forward-ed  输出的格式类似ed的script文件,但按照原来文件的顺序来显示不同处。

-H或--speed-large-files  比较大文件时,可加快速度。

-l或--ignore-matching-lines  若两个文件在某几行有所不同,而这几行同时都包含了选项中指定的字符或字符串,则不显示这两个文件的差异。

-i或--ignore-case  不检查大小写的不同。

-l或--paginate  将结果交由pr程序来分页。

-n或--rcs  将比较结果以RCS的格式来显示。

-N或--new-file  在比较目录时,若文件A仅出现在某个目录中,预设会显示:Only in目录:文件A若使用-N参数,则diff会将文件A与一个空白的文件比较。

-p  若比较的文件为C语言的程序码文件时,显示差异所在的函数名称。

-P或--unidirectional-new-file  与-N类似,但只有当第二个目录包含了一个第一个目录所没有的文件时,才会将这个文件与空白的文件做比较。

-q或--brief  仅显示有无差异,不显示详细的信息。

-r或--recursive  比较子目录中的文件。

-s或--report-identical-files  若没有发现任何差异,仍然显示信息。

-S或--starting-file  在比较目录时,从指定的文件开始比较。

-t或--expand-tabs  在输出时,将tab字符展开。

-T或--initial-tab  在每行前面加上tab字符以便对齐。

-u,-U或--unified=  以合并的方式来显示文件内容的不同。

-v或--version  显示版本信息。

-w或--ignore-all-space  忽略全部的空格字符。

-W或--width  在使用-y参数时,指定栏宽。

-x或--exclude  不比较选项中所指定的文件或目录。

-X或--exclude-from  您可以将文件或目录类型存成文本文件,然后在=中指定此文本文件。

-y或--side-by-side  以并列的方式显示文件的异同之处。

--help  显示帮助。

--left-column  在使用-y参数时,若两个文件某一行内容相同,则仅在左侧的栏位显示该行内容。

--suppress-common-lines  在使用-y参数时,仅显示不同之处。

比较后的不同之处以指定的形式列出,如下所示:

n1 a n3,n4
n1,n2 d n3
n1,n2 c n3,n4

其中,字母"a"、"d"、"c"分别表示添加、删除及修改操作。而"n1"、"n2"表示在文件1中的行号,"n3"、"n4"表示在文件2中的行号。

注意:以上说明指定了两个文件中不同处的行号及其相应的操作。在输出形式中,每一行后面将跟随受到影响的若干行。其中,以<开始的行属于文件1,以>开始的行属于文件2。

11,12d10″表示第一个文件比第二个文件多了第11和12行。

diff log2013.log log2014.log  -y -W 50

“|”表示前后2个文件内容有不同

 
“<”表示后面文件比前面文件少了1行内容
 
“>”表示后面文件比前面文件多了1行内容

2,4c2,4 的含义是:第一个文件中的第[2,4]行(注意这是一个闭合区间,包括第2行和第4行)需要做出修改才能与第二个文件中的[2,4]行相匹配。
接下来的内容则告诉我们需要修改的地方,前面带 < 的部分表示左边文件的第[2,4]行的内容,而带> 的部分表示右边文件的第[2,4]行的内容,中间的 --- 则是两个文件内容的分隔符号。

diff log2014.log log2013.log  -u

--- log2014.log 2012-12-07 18:01:54.000000000 +0800
 
+++ log2013.log 2012-12-07 16:36:26.000000000 +0800

“—“表示变动前的文件,”+++”表示变动后的文件。

diff log2013.log log2014.log  -c

2
3
4
5
“+” 比较的文件的后者比前着多一行
 
“-” 比较的文件的后者比前着少一行
 
“!” 比较的文件两者有差别的行

comm命令的参数

-1   不显示只在第1个文件里出现过的列。
-2 不显示只在第2个文件里出现过的列。
-3 不显示只在第1和第2个文件里出现过的列。

comm命令是一个非常简洁的命令,其只有两个参数。不过三个参数也结常要组合使用,我们常用的用法如下:

comm - 12     就只显示在两个文件中都存在的行;
comm - 23 只显示在第一个文件中出现而未在第二个文件中出现的行;
comm - 123 则什么也不显示。

comm找出文件2中有,文件1中没有的行:

cat /etc/dhcpd.conf|grep "fixed-address"|grep -v ^#|awk '{print $NF}'|sed 's/;//g'|sort > /tmp/1.txt
arp -n|grep ether|grep -v eth0|awk '{ print $1}'|sort >/tmp/2.txt
comm -23 2.txt 1.txt

注:两个文件的内容在比较前,一定要进行sort排序。不然输出的结果将是错误的。

方法二:diff命令比较

diff命令是一个比较经典的文本比较工具了,diff命令较comm的参数要多。其经常和patch命令组合使用,进行补丁升级。其默认使用的是-a参数,即逐行比较两个文件之间的不同。此处我们要实现想要得到的结果,还需要配合grep和awk实用:

diff 2.txt 1.txt |grep "<"|awk ' $1 = " " '

注:此处也发现,在使用diff命令进行比较时,也需要预先对经比较的文件进行sort排序,不然输出的结果同样是不正确的。

方法三:awk实现

awk应该算是shell常用命令中的泰山北斗了,几乎很多其他命令能完成的工作,awk都能完成(只不过有些写起来可能比较复杂)。本例中也不例外:

awk 'NR==FNR{a[$0]++} NR>FNR&&!a[$0]' 1.txt 2.txt

找出两个文件之间的相同部分可以使用

awk 'NR==FNR{a[$0]++} NR>FNR&&a[$0]'  1.txt 2.txt

下面的两个语句也可以换成:

awk  'NR==FNR{a[$0]}NR>FNR{ if(!($1 in a)) print $0}' file1 file2 找出文件2中不同的值
awk 'NR==FNR{a[$0]}NR>FNR{ if($1 in a) print $0}' file1 file2 找出两文件中相同的值

注:

1、awk实现时,并不需要事先对两个文件进行sort排序,

2、注意和上两个命令中两个文件的放置顺序是不同的。三种实现方法,文件的顺序一定颠倒,颠倒了,效果就刚好想反了,就变成找出文件1中有文件2中没有的行了。

方法四:grep误人子弟法

网上另外流传一个错误的方法,即通过grep命令实现:

grep -v -f 1.txt 2.txt

经测试,无论我事先是否对两个文件进行sort倒序,此方法输出的结果,发现都是不正确的。

最新文章

  1. extjs学习之Ext.selection.CheckboxModel
  2. asp.net mvc 应用Bundle(捆绑和微小)压缩技术 启用 BundleConfig 配置web.config
  3. css中box-shadow阴影效果的使用
  4. mysql 启动错误-server PID file could not be found
  5. Java魔法堂:初探MessageFormat.format和ChoiceFormat
  6. ***git 本地提交后如果让服务器上的GIT 自动更新拉取
  7. js数组去重的三种常用方法总结
  8. python SendMail 发送邮件
  9. 死锁线程探讨Java中的死锁现象
  10. 如何用 Git 合并两个库,并保留提交历史
  11. T-SQL 删除重复数据SQL
  12. thinkphp5基础
  13. hadoop配置项笔记 - yarn
  14. Spring4.0开始的泛型依赖
  15. 腾讯内推一面C++
  16. BizTalk 新增/修改/删除 XmlDocument 名字空间的高效方法
  17. shell脚本中的数据传递方式
  18. Yii2返回以主键id为键名的数组
  19. BZOJ 4591 【SHOI2015】 超能粒子炮&#183;改
  20. 常用的第三方模块 requests url

热门文章

  1. Sql server 打不开了,无法识别的配置节 system.serviceModel 解决方案
  2. 当您尝试再次安装 SQL Server 时,SQL Server 2008年安装将会失败
  3. NPOI 1.2教程(目录)操作Excel
  4. XV Open Cup named after E.V. Pankratiev Stage 6, Grand Prix of Japan Problem J. Hyperrectangle
  5. 【BZOJ】1665: [Usaco2006 Open]The Climbing Wall 攀岩(spfa)
  6. (转)java并发对象锁、类锁、私有锁
  7. poj 1815(最小割、割集)
  8. 面试STAR法则
  9. sql优化(1)
  10. linux的%用法