<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-314  評論-209  文章-0  trackbacks-0

    在項目中遇到一個奇怪的bug,是由一行簡單代碼引起的。
    代碼作用:比較兩個UNIX文本文件,找出并打印文本2比文本1新增加的內(nèi)容。
    代碼調(diào)用了diff命令,例如:
     
     

    復(fù)制代碼
    代碼如下:

    # temp1.txt文件內(nèi)容
    $> cat temp1.txt
    20110224
    20110225
    20110228
    20110301
    20110302
    # temp2.txt文件內(nèi)容
    $> cat temp2.txt
    20110228
    20110301
    20110302
    20110303
    20110304

     

    # diff命令輸出結(jié)果


    復(fù)制代碼
    代碼如下:

    $> diff temp1.txt temp2.txt
    1,2d0
    < 20110224
    < 20110225
    5a4,5
    > 20110303
    > 20110304
    # 只輸出temp2.txt文件獨有的內(nèi)容
    $> diff temp1.txt temp2.txt | grep "> " | sed 's/> //g'
    20110303
    20110304

     

    說明:輸出結(jié)果去掉了兩個文件的共同內(nèi)容,只輸出了temp2.txt的新增部分,和預(yù)想的結(jié)果一樣。
     
    但是,隨著temp1.txt文件內(nèi)容的增加,diff命令出現(xiàn)了不同預(yù)期的結(jié)果:


    復(fù)制代碼
    代碼如下:

    $> cat temp1.txt
    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
    $> cat temp2.txt
    20110228
    20110301
    20110302
    20110303
    20110304
    20110307
    20110308
    20110309
    20110310
    20110311
    20110314
    $> diff temp1.txt temp2.txt
    1,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'
    20110228
    20110301
    20110302
    20110303
    20110304
    20110307
    20110308
    20110309
    20110310
    20110311
    20110314

     

    可以看到,diff命令不但輸出了temp2.txt文件的新增部分(20110304-20110314),也同時輸出了兩個文件的共同內(nèi)容(20110228-20110303),從而導(dǎo)致了與預(yù)期不一致的結(jié)果。
    查看diff命令的man手冊發(fā)現(xiàn),diff的作用是比較兩個文件的內(nèi)容,并輸出兩個文件之間的差異,產(chǎn)生一個能夠?qū)蓚€文件互相轉(zhuǎn)換的列表,但這個列表并不能100%保證是最小集。
    于是,以上例子中,可以看到diff給出了temp1.txt和temp2.txt文件的比較差異結(jié)果,但其中包含了兩個文件的共同部分,因此與預(yù)期不一樣。
     
    解決方法:
    用comm命令代替diff,例如:


    復(fù)制代碼
    代碼如下:

    $> comm -13 temp1.txt temp2.txt
    20110304
    20110307
    20110308
    20110309
    20110310
    20110311
    20110314

     

    comm命令用來比較兩個文件,具體用法:
    comm [-123] file1 file2
    -1 過濾file1獨有的內(nèi)容
    -2 過濾file2獨有的內(nèi)容
    -3 過濾file1和file2重復(fù)的內(nèi)容
     
    備注:
    diff的輸出格式,主要有以下幾種:
    n1 a n3,n4
    n1,n2 d n3
    n1,n2 c n3,n4
    例如"1,2d0" "5a4,5" "1,55c1,11"等。
    其中n1和n2指第一個文件的行數(shù),n3和n4指第二個文件的行數(shù)。"a"代表add增加,"d"代表delete刪除,"c"代表change整塊變動。
    有了diff的輸出結(jié)果,可以使用patch命令將一個文件恢復(fù)成另一個,例如:


    復(fù)制代碼
    代碼如下:

    $> cat temp1.txt
    20110224
    20110225
    20110228
    20110301
    20110302
    $> cat temp2.txt
    20110228
    20110301
    20110302
    20110303
    20110304
    $> diff temp1.txt temp2.txt > temp.diff
    $> cat temp.diff
    1,2d0
    < 20110224
    < 20110225
    5a4,5
    > 20110303
    > 20110304
    # 使用temp.diff和temp1.txt恢復(fù)temp2文件
    $> patch -i temp.diff -o temp2_restore.txt temp1.txt
    Looks like a normal diff.
    done
    # 完成后temp2_restore和原temp2文件內(nèi)容一致
    $> cat temp2_restore.txt
    20110228
    20110301
    20110302
    20110303
    20110304
    posted on 2016-03-24 12:09 xzc 閱讀(1073) 評論(1)  編輯  收藏 所屬分類: linux/unix

    評論:
    # re: linux diff與comm命令比較文件(找出新增內(nèi)容) 2016-03-24 12:09 | xzc
    comm -23 ${logs_path}/${shell_name}_${file_name_prefix}_ftp.log ${logs_path}/${shell_name}_${file_name_prefix}_hdfs.log  回復(fù)  更多評論
      
    主站蜘蛛池模板: 亚洲高清不卡视频| 亚洲男女内射在线播放| 久久久久久亚洲精品成人| 一级毛片在播放免费| 久久精品国产亚洲Aⅴ香蕉| 亚洲成av人片在线天堂无| 插B内射18免费视频| 中文字幕亚洲综合久久综合| 在线观看免费人成视频色9| 亚洲videosbestsex日本| 久久久久国色AV免费看图片| 亚洲日本国产综合高清| 麻豆国产VA免费精品高清在线 | 成人黄网站片免费视频| 亚洲成av人片天堂网| a级成人免费毛片完整版| 亚洲AV无码乱码国产麻豆| 最近免费最新高清中文字幕韩国 | 亚洲三区在线观看无套内射| 中国性猛交xxxxx免费看| 午夜亚洲国产理论秋霞| 国产福利在线免费| 激情小说亚洲图片| 久久精品亚洲男人的天堂| 一级毛片不卡片免费观看| 亚洲婷婷在线视频| 国产精品免费视频一区| 一级特黄录像免费播放肥| 亚洲色图国产精品| 妞干网免费视频在线观看| 国产在亚洲线视频观看| 亚洲国产成人一区二区精品区 | 大胆亚洲人体视频| 久久久久久AV无码免费网站| 亚洲国产成人91精品| 亚洲av手机在线观看| 久久精品免费电影| 蜜芽亚洲av无码一区二区三区| 亚洲综合激情另类专区| 无码国产精品一区二区免费式影视| 亚洲AV日韩AV一区二区三曲|