Chinaunix首页 | 论坛 | 博客
  • 博客访问: 61811
  • 博文数量: 26
  • 博客积分: 315
  • 博客等级: 二等列兵
  • 技术积分: 299
  • 用 户 组: 普通用户
  • 注册时间: 2012-08-05 17:32
文章分类
文章存档

2014年(13)

2013年(3)

2012年(10)

我的朋友

分类: LINUX

2013-02-14 16:26:35

摘自:[]Harley HahnUnix & Linux大学教程

 

十二、过滤器:比较与抽取

(1)比较任意两个文件:cmp

cmp的使用只有一种情形:查看两个文件是否相同。语法为:

cmp file1 file2

cmp可以比较任何文件。


(2)比较有序文本文件:comm

comm程序一行一行地比较两个有序的文本文件。当有两个相似的文件并且希望查看它们之间的区别时,可以使用comm程序,语法:


comm [-123]file1 file2

程序可以以3列显示输出:第一列包含只有第一个文件中的行,第二列包含只有第二个文件中的行,第三行包含两个文件都有的行。-1、-2、-3选项分别抑制第一列、第二列、第三列的输出。



(3)比较无序文本文件:diff

当需要比较无序文件和比较大的文件时,可以使用diff,语法:

diff [-bBiqswy] [-c | -C lines| -u | -U lines] file1 file2

其中,file1和file2是文本文件的名称,lines是说明上下文关系的行号。


当比较两个相同文件时,无输出。不同时,显示一组指示,遵循它可将第一个文件修改为第二个文件。

diff的输出使用3个单字符指示:c(change,改变)、d(delete,删除)和a(append,追加)。c、d、a第个字符的左边和右边都有一串行号,左边的数字指第一个文件中的行,右边指第2个文件的行。

无论何时,当diff要求改变时,它就给出每一个文件的实际行。第一个文件中的行由一个<(小于号)标记,第二个文件中的行由一个>(大于号)标记。出于可读性考虑,两组行被若干连字符(--)构成的线分隔开。

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

-w(whitespace,空白行)选项忽略所有的空白符(空格和制表符);

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

-B选项(Blank lines,空白行)忽略所有的空白行。

其余的选项控制diff如何显示结果。-q(quiet,静止)告诉diff,当两个文件不同时,忽略所有细节。-s(same,相同),显示两个文件相同。


(4)比较文件时的输出格式:diff,sdiff

diff使用-c(context,上下文关系)时,显示存在不同的实际行,同时还显示不同行的上面和下面各两行的内容。第一个文件由*(星号)标记,第二个文件由-(连字符)标记。在两行之后,是每一个文件的摘录,显示应如何改变以让两个文件相同。

-u(unified output,统一输出)选项,类似于-c选项的输出,但没有重复行。

默认情况下,当对diff使用-c或者-u选项时,输出在每个不同点的上方和下方分别显示两行上下文。但是如果希望显示不同数量的上下文行,可用-C(大写字母“C")代替-c,-U(大写字母”u”)代替-u,后接希望显示出的数量。例

diff -C5 file1 file2            diff -U3 file1 file2

-y选项,并排输出结果。

如果喜欢可以并排输出。还有一个特殊用途的程序sdiff(side-by-side diff,可用它替代diff -y)语法为:

sdiff [-bBilsW] [-w columns] file1 file2

其中file1和file2是文件名,columns是列宽;

-l(小写L)选项,重复时只显示左边的列;

-s(same)选项,不显示重复;

-w选项,改变列的宽度。

其余选项与diff相同。


(5)差分和补丁

将一个文件转换为另一个文件时的一串指示叫一个差分(diff)。

使用差分(以一个文件重新创建另一个文件),称为应用了差分,用来应用差分的程序称为patch。


(6)抽取数据:cut

cut可以从每行中抽取特定列,也可以从每行中抽取字区域(称为字段),语法为

cut -c list [file...]

其中list是要抽取的列表,file是输入文件的名称。

使用列表告诉cut抽取哪些列时,可以指定一个或多个列号,用逗号分隔,列表中不含空格,还可以指定列的范围,用连字符连接。例 1,8,10-15。

可省略-c后的空格。

机器可读的文件数据(如Candy:Charles:345),每行称为一个记录(record)。每行的各个部分称为字段(field),而充当字段分隔符的字符称为定界符(delimiter)。常见的定界符有逗号、空格、制表符和空白符(也就是制表符和空格的组合)。

抽取字段的命令语法为

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

其中,list是抽取字段的列表,delimiter是分隔字段所用的定界符,file是输入文件的名称。

cut -f 1 -d ":" /etc/passwd | sort   (-f, -d 可省略空格)


(7)组合数据列:paste

paste程序组合数据列,有极大的灵活性,可将几个文件组成一个大表,也可将连续的数据行组合起来,构建数据列。我们集中讨论paste程序最可用的特性:组合分离的文件,其它可参阅说明书页(man paste)。

语法: paste [-d char...] [file...]

其中char是用作分隔符的字符,而file是输入文件的名称。

默认情况下,paste在每两列实体之间放一个制表符字符,而Unix假设制表符为每8个位置一个,且以位置1为起点,即位置1,9,17,25等。为使用非制表符作定界符,可使用-d选项,后面一个括在单引号中的备选字符。如果指定不止一个定界符,paste将轮流使用定界符。



阅读(1905) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~