Unix&Linux大学教程:17 过滤器:比较和抽取

17 过滤器:比较和抽取

 

17.1 比较文件

        过滤器               作用                  章号          文件类型    文件数量

        cmp             比较两个文件              17              二进制或文本      2个

        comm            比较两个有序文件        17              文本:有序 2个

        diff            比较两个文件,显示区别       17              文本          2个

        sdiff           比较两个文件,显示区别       17              文本          2个

        cut             从数据中抽取指定列(字段)17           文本          1个或多个

        paste           组合数据列         17              文本          1个或多个

        sort            排序数据            19              文本          1个或多个

        uniq            选取重复/唯一行          19              文本:有序 1个

        grep            选取包含指定模式的行  19              文本          1个或多个

        look            选取以指定模式开头的行       19              文本:有序 1个

 

17.2 比较任意两个文件:cmp

        相关过滤器:comm,diff,sdiff

        语法:

                cmp file1 file2

        功能:逐字节地比较两个文件,查看文件是否相同。

        注:cmp可比较任何类型的文件(文本文件和二进制文件),例如图片,音乐文件等。

 

17.3 比较有序文本文件:comm

        相关过滤器:cmp,diff,sdiff

        语法: comm [-123] file1 file2

        功能:查看两个文件之间的区别,该程序以3列输出,第一列包含只在第一个文件中有的行,第二列包含只在第二个文件中有的行,第三列包含两个文件中都有的行。

        注:为了控制输出,comm允许使用-1,-2,-3选项分别抑制掉第一列,第二列,第三列的输出。

 

17.4 比较无序文本文件:diff

        相关过滤器:cmp,comm,sdiff

        语法:

                diff [-bBiqswy] [-c|-Clines|-u|-Ulines] file1 file2

        功能:显示将第一个文件修改为第二个文件所遵循的指示。c(change),d(delete),a(append).第一个文件中的行由"<"标记,第二个文件中的行由">"标记。

        例:

                3c3告诉我们,将第一个文件中的第三行改变成第二个文件的第三行。      

                1a2,将第一个文件的第一行之后追加第二个文件中的第二行。

                4d3,删除第一个文件的第四行,可以胡骆d之后的数字,它说明在第二个文件的什么地方发现了区别。

 

17.5 diff使用的选项

        -i(case insensitive,不区分大小写)

        -w(whitespace,空白符),忽略所有的空白符。

        -b,不忽略所有的空白符,而只忽略空白符数量上的区别。

        -B(blank lines,空白行),忽略所有的空白行

        -q(quiet,静止),当两个文件不同时,省略所有的细节。

        -s(same),两文件相同时,显示两文件是相同的提示。

 

17.6 比较文件时的输出格式:diff,sdiff

        diff -c(context,上下文关系) -u(unified output,统一输出 ) -y(两文件并排显示)

 

        administrator@ubuntu:~/桌面$ diff -c old-names new-names 

        *** old-names   2011-04-27 09:00:52.283416002 +0800

        --- new-names   2011-04-27 09:01:48.859416000 +0800

        ***************

        *** 1,4 ****

          Gene Pool

          Will Power

        ! Paig Turner

          Mark Mywords

        --- 1,4 ----

          Gene Pool

          Will Power

        ! Paige Turner

          Mark Mywords

        administrator@ubuntu:~/桌面$ diff -u old-names new-names 

        --- old-names   2011-04-27 09:00:52.283416002 +0800

        +++ new-names   2011-04-27 09:01:48.859416000 +0800

        @@ -1,4 +1,4 @@

         Gene Pool

         Will Power

        -Paig Turner

        +Paige Turner

         Mark Mywords

        administrator@ubuntu:~/桌面$ diff -y old-names new-names 

        Gene Pool                                                       Gene Pool

        Will Power                                                      Will Power

        Paig Turner                                                   | Paige Turner

        Mark Mywords                                                    Mark Mywords

 

        希望显示不同数量的上下文,使用大写+数字:     

                diff -C5 file1 file2

                diff -U# file1 file2

 

        sdiff(side-by-side diff,并排diff),可用来代替diff -y

 

        sdiff 语法:

                sdiff [-bBilsW] [-w columns] file1 file2        colomns是列宽

        -l:             当两个文件拥有共同的行时,该选项只显示左边的列。

        -s(same):     告诉sdiff不显示两个文件中相同的任何行。

        -w:             改变列的宽度。

        -i:             忽略大小写

        -W:             忽略所有的空白符        注:sdiff使用-W,diff使用-w

        -b:           忽略空白符数量上的区别

        -B              忽略空白行

 

 

        例:

                sdiff -s -w 30 file1 file2

 

17.7 差分和补丁

        diff foo-2.0.c foo-2.1.c > foo-diff-2.1

        patch程序应用更新。

 

17.8 抽取数据列:cut

        相关过滤器:colrm,join,paste

        功能:从一个数据中抽取指定列并将其他内容抛弃的过滤器(colrm相反,colrm从数据中删除指定列并保存其他内容)

        语法:

                cut -c list [file...]

                list:要抽取的列的列表

        例:

                cut -c 14-32,42-49 info         

                cut -c 14-32,42-49 info > phonelista            简写:       cut -c14-32,42-49 info > phonelist

                who | cut -c 1-8 | sort | uniq -c | grep "2"

 

17.9 记录、字段和定界符;抽取数据字段:cut

        对于文件:

                        mbercrmbie:Al:123

                        Barton:Barbara:234

                        Canby:Charles:345

                        Danfield:Deann:456

        每行都称为一个记录(record),每行的各个部分称为字段(field),而充当字段分隔符的字符称为定界符(delimiter)。

        语法:

                cut -c list [file...]

                cut -f list [-d delimiter] [-s] [file...]

                list是抽取字段的列表,delimiter是分隔字段所使用的定界符。

 

        例:

                cut -f 1 -d ':' /etc/passwd             简写:cut -f1 -d':' /etc/passwd

                cut -f 1,3-5 -d ':' /etc/passwd | sort  简写:cut -f1,3-5 -d':' /etc/passwd | sort

 

17.10 组合数据列:paste

        相关过滤器:colrm,cut,join

        语法:

                paste [-d char...] [file...]

                char是用作分隔符的字符。

 

        例:

                paste -d '|%' idnumber name birthday phone      paste将轮流使用“|”和"%"这两个定界符

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值