学习笔记,内容基础,适合初学者。
阅读之前,请务必花30秒查看前言说明(在第一、二章前面部分)
《Unix & Linux 大学教程》 - 第一、二章 学习笔记 Unix简介 & 什么是Linux?什么是Unix
第十九章:过滤器:选取、排序、组合及变换
第十九章第一部分
基础知识
程序/命令
grep(re代表regular expression,正则表达式;g代表global,全局;p代表print,打印)
语法
grep [-cilLnrsvwx] pattern [file...]
pattern是要搜索的模式(翻译的实在让人太不爽了,pattern应该就是要搜索的内容吧?!)
file是输入文件的名称
-c(count,统计):显示所抽取行的数量
-i(ignore,忽略):忽略大小写
-n:在输出的每一行前面写一个相对行号
-l(list filename,列举文件名):指定此选项时,grep不显示包含该模式的各行,而是将包含这种模式的文件名称列出来
-L:与-l相反,将不包含这种模式的文件名称列出来
-w:指定只希望搜索完整的单词
-v(reverse,相反):选项选取不包含指定模式的所有行。
-x:查找pattern占用整行的那些行
-r(recursive,递归):递归搜索子目录以及子目录下的所有文件
-s(suppress,抑制):搜索的时候,不显示类似于下面的log
fgrep:快速版本的grep,只搜索“固定字符”的字符串,不允许使用正则。
egrep:grep的扩展版本,原始的grep只允许基本的正则表达式,egrep支持功能更强大的“扩展正则表达式”。(第20章讨论他们的区别)
使用grep -E和egrep允许使用扩展正则表达式。
look
语法
look [-df] pattern file...
pattern是搜索模式
file是文件名称
作用:程序搜索以字母顺序排列的数据,并查找所有以特定模式开头的行。
look不能从标准输入中读取数据,它必须从一个或多个文件中获取输入。因为它使用二分法查找,需要同时访问所有数据。
所以只能在管道开头使用,但是不能在管道中间使用它。
-d:忽略标点符号和其他特殊字符
-f(fold,同等):告诉sort忽略大小写
look pattern
查找以pattern开头的单词(在dictionary file - 字典文件中查找)
sort
语法
sort [-dfnru] [-o outfile] [infile...]
outfile是存放输出的文件的名称
infile是包含输入的文件的名称
作用:排序数据
如果想将输出保存到输入的文件中(比如:想对names文件排序,然后再输出到names中),需要使用-o选项
sort -o names names
否则,当重定向标准输出时,shell在运行命令之前建立输出文件,所以下面的命令会导致names被清空,然后执行sort,所以最终结果就是names是个空文件。
sort names > names(错误)
-d(dictionary,字典):只查看字母、数字和空白符(空格和制表符)。当数据中包含可能妨碍排序过程的字符(标点符号等),可以使用这个选项
-f(fold,等同):忽略大小写
-n(numeric,数字):识别行开头或者字段开头的数字,并按数字进行排序。数字可以包含前导0、负号和小数点
-r(reverse,反向):反向排序
-u(unique,唯一):查找相同的行,并相同行只留下一行
语法
sort -c[u] [file]
file是文件名称
作用:检查数据是否有序
-c(check,检查):不排序,只检查
-cu:检查顺序和重复行
sort -c test sort: test:6: disorder: d
比如我对test文件排序,如果test无序,则会出现类似上面的log
sort: test:表示对test排序,后面的6表示第六行的时候顺序就不对了,第六行为d
区域设置(locale)与排序
sort的结果是和locale设置有关的
如果我们要对A,a,C,c,B,b排序,那么有两种常见结果
第一种为:A,B,C,a,b,c
第二种为:a,A,b,B,c,C
第一种以ASCII表的顺序排列(关于ASCII表请见文章末尾),需要记住的顺序:制表符、空格、数字、大写字母、小写字母。称为C区域或者POSIX区域
第二种则以locale为美国英语(en_US)排序(除了排序不同,其余都相同)
en_US和C的排列结果区别很大,自行查表吧
注:比如,如果使用rm [A-Z]*,那么结果是和排序有关的。如果locale=C,那么结果就是删除了大写字母开头的文件;如果locale=en_US,那么就是删除了除了以小写a开头的所有以英文字母开头的文件。
locale -a:查看系统支持的区域
环境变量
LC_COLLATE:指定排序方式
export LC_COLLATE=C
uniq
语法
uniq [-cdu] [infile [outfile]]
uniq的输入必须是有序的(如果是无序的,也不会提示错误)
infile是输入的文件的名称
outfile是输出的文件的名称
作用:消除重复行;选取重复行;选取唯一行;统计重复行数量。
-c:统计重复行
-d:只查看重复行
-u:只查看唯一行
uniq data:重复行只留一行
uniq data newdata:将结果输出到newdata中
uniq -du data:无输出
(上面的data一定要有序)
取两个文件行的交集
sort file1 file2 | uniq -d
join
语法
join [-i] [-a1|-v1] [-a2|-v2] [-1 field1] [-2 field2] file1 file2
field1和field2是引用特定字段的数字
file1和file2是包含有序数据的文件的名称
join像是数据库中的联合查询(当然,也不是那么智能,两个文件内容都需要有序)
假设我们有这样两个文件name和age,其中name文件中有每个人的id和name,age文件中有每个人的id和age。
name | age | ||||||||||||||||||||
|
|
默认情况下,join假定各个字段之间用空白符分隔,假定联接字段是每个文件的第一个字段
join name age 1 a 14 2 b 18 3 c 54 5 e 26 4 d 45
结果看上去还不错
但是数据源肯定不会总是这么完美,如果name中,只有id=1,3,5,而age中,只有id=1,2,3,4,那情况会是如何呢
join name age 1 a 14 3 c 54
join会找出他们公共部分(类似于inner join)
有了inner join大家肯定也会想,left join、right join、full join
总结下对应关系
left join:join -a1 name age
right join:join -a2 name age
full join:join -a1 -a2 name age
inner join:join name age
这里-a中的a表示all
-v(reverse,相反):-v1,只输出第一个文件中的不匹配行
-i:忽略大小写
-1 +字段编号:指定第一个文件的联接字段
-2 +字段编号:指定第二个文件的联接字段
join -1 2 -2 3 file1 file2(以file1的第二个字段和file2的第3个字段做连接)
(注意:join的结果与环境变量LC_COLLATE值有关)
tsort
语法
tsort [file]
作用:由偏序建立全序(只要偏序中没有圈)
简化一下书中的例子给予说明
今天周末,宅男A快要下班了,正计划晚上的安排,于是它列举了一些回家要做的事情,并且有一定的顺序
烧水要在泡面之前
扫地要在擦地之前
看片要在睡觉之前
泡面要在吃饭之前
吃饭要在看片之前
擦地要在吃饭之前
睡觉要在做梦之前
吃饭要在睡觉之前
哥们写好了,保存到一个叫todo的文件中格式为:
烧水 泡面
扫地 擦地
看片 睡觉
泡面 吃饭
吃饭 看片
擦地 吃饭
睡觉 做梦
吃饭 睡觉
有个妞问宅男A:“你今晚什么安排阿?”,哥们想了想,觉得不能把文件给姑娘让人家自己分析啊,于是哥们决定使用tsort!
tsort todo 扫地 烧水 擦地 泡面 吃饭 看片 睡觉 做梦
然后…………………………
tsort就是干这个用的,帮你缕清关系,然后排序。
strings
语法
strings [-length] [file...]
length是要显示的字符串的最小长度
file是文件名称,通常是一个路径名
默认情况下,strings只抽取至少有4个字符串长的字符串
作用:显示可执行文件中的字符串
名词解释
联接:当基于匹配的字段组合两组数据时,我们称之为联接(名称来自数据库理论)
联接字段(join field):用来匹配的具体字段称为联接字段
DAG(directed acyclic graph):有向无环图(不明白含义的同学请参看图论书籍)
ASCII(中文维基百科)
ASCII(英文维基百科)
转贴请保留以下链接
本人blog地址
http://su1216.iteye.com/
http://blog.csdn.net/su1216/