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将轮流使用“|”和"%"这两个定界符