全部博文(26)
分类: LINUX
2013-02-14 16:26:35
摘自:[美]Harley Hahn:Unix & 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将轮流使用定界符。