科技常识:linux diff与comm命令比较文件(找出新增内容)

2021-06-25 09:38:43
导读 今天小编跟大家讲解下有关科技常识:linux diff与comm命令比较文件(找出新增内容),相信小伙伴们对这个话题应该也很关注吧,小编也收集到

今天小编跟大家讲解下有关科技常识:linux diff与comm命令比较文件(找出新增内容),相信小伙伴们对这个话题应该也很关注吧,小编也收集到了有关科技常识:linux diff与comm命令比较文件(找出新增内容)的相关资料,希望小伙伴会喜欢也能够帮助大家。

在项目中遇到一个奇怪的bug,是由一行简单代码引起的。代码作用:比较两个UNIX文本文件,找出并打印文本2比文本1新增加的内容。代码调用了diff命令,例如:复制代码代码如下: # temp1.txt文件内容$> cat temp1.txt2011022420110225201102282011030120110302# temp2.txt文件内容$> cat temp2.txt2011022820110301201103022011030320110304

# diff命令输出结果

复制代码代码如下:$> diff temp1.txt temp2.txt1,2d0< 20110224< 201102255a4,5> 20110303> 20110304# 只输出temp2.txt文件独有的内容$> diff temp1.txt temp2.txt | grep">"| sed 's/> //g'2011030320110304

说明:输出结果去掉了两个文件的共同内容,只输出了temp2.txt的新增部分,和预想的结果一样。但是,随着temp1.txt文件内容的增加,diff命令出现了不同预期的结果:

复制代码代码如下:$> cat temp1.txt20101216201012172010122020101221201012232010122420101227201012282010122920101230201012312011010320110104201101052011010620110107201101102011011120110112201101132011011420110117201101182011011920110120201101212011012420110125201101262011012720110128201101312011020120110202201102032011020420110207201102082011020920110210201102112011021420110215201102162011021720110218201102212011022220110223201102242011022520110228201103012011030220110303$> cat temp2.txt2011022820110301201103022011030320110304201103072011030820110309201103102011031120110314$> diff temp1.txt temp2.txt1,55c1,11< 20101216< 20101217< 20101220< 20101221< 20101223< 20101224< 20101227< 20101228< 20101229< 20101230< 20101231< 20110103< 20110104< 20110105< 20110106< 20110107< 20110110< 20110111< 20110112< 20110113< 20110114< 20110117< 20110118< 20110119< 20110120< 20110121< 20110124< 20110125< 20110126< 20110127< 20110128< 20110131< 20110201< 20110202< 20110203< 20110204< 20110207< 20110208< 20110209< 20110210< 20110211< 20110214< 20110215< 20110216< 20110217< 20110218< 20110221< 20110222< 20110223< 20110224< 20110225< 20110228< 20110301< 20110302< 20110303---> 20110228> 20110301> 20110302> 20110303> 20110304> 20110307> 20110308> 20110309> 20110310> 20110311> 20110314$> diff temp1.txt temp2.txt | grep">"| sed 's/> //g'2011022820110301201103022011030320110304201103072011030820110309201103102011031120110314

可以看到,diff命令不但输出了temp2.txt文件的新增部分(20110304-20110314),也同时输出了两个文件的共同内容(20110228-20110303),从而导致了与预期不一致的结果。查看diff命令的man手册发现,diff的作用是比较两个文件的内容,并输出两个文件之间的差异,产生一个能够将两个文件互相转换的列表,但这个列表并不能100%保证是最小集。于是,以上例子中,可以看到diff给出了temp1.txt和temp2.txt文件的比较差异结果,但其中包含了两个文件的共同部分,因此与预期不一样。解决方法:用comm命令代替diff,例如:

复制代码代码如下:$> comm -13 temp1.txt temp2.txt20110304201103072011030820110309201103102011031120110314

comm命令用来比较两个文件,具体用法:comm [-123] file1 file2-1 过滤file1独有的内容-2 过滤file2独有的内容-3 过滤file1和file2重复的内容备注:diff的输出格式,主要有以下几种:n1 a n3,n4n1,n2 d n3n1,n2 c n3,n4例如"1,2d0" "5a4,5" "1,55c1,11"等。其中n1和n2指第一个文件的行数,n3和n4指第二个文件的行数。"a"代表add增加,"d"代表delete删除,"c"代表change整块变动。有了diff的输出结果,可以使用patch命令将一个文件恢复成另一个,例如:

复制代码代码如下:$> cat temp1.txt2011022420110225201102282011030120110302$> cat temp2.txt2011022820110301201103022011030320110304$> diff temp1.txt temp2.txt > temp.diff$> cat temp.diff1,2d0< 20110224< 201102255a4,5> 20110303> 20110304# 使用temp.diff和temp1.txt恢复temp2文件$> patch -i temp.diff -o temp2_restore.txt temp1.txtLooks like a normal diff.done# 完成后temp2_restore和原temp2文件内容一致$> cat temp2_restore.txt2011022820110301201103022011030320110304

来源:爱蒂网

免责声明:本文由用户上传,如有侵权请联系删除!

猜你喜欢

最新文章