《Unix & Linux 大学教程》 - 第十九章(一) 学习笔记

学习笔记,内容基础,适合初学者。


阅读之前,请务必花30秒查看前言说明(在第一、二章前面部分)

《Unix & Linux 大学教程》 - 第一、二章 学习笔记   Unix简介 & 什么是Linux?什么是Unix
《Unix & Linux 大学教程》 - 第三、四章 学习笔记   Unix连接 & 开始使用Unix
《Unix & Linux 大学教程》 - 第五、六章 学习笔记   GUI:图形用户界面 & Unix工作环境
《Unix & Linux 大学教程》 - 第七、八章 学习笔记   Unix键盘使用 & 能够立即使用的程序
《Unix & Linux 大学教程》 - 第九、十章 学习笔记   文档资料:Unix手册与Info & 命令语法
《Unix & Linux 大学教程》 - 第十一、十二章 学习笔记   shell & 使用shell:变量和选项
《Unix & Linux 大学教程》 - 第十三章 学习笔记   使用shell:命令和定制
《Unix & Linux 大学教程》 - 第十四、十五章 学习笔记   使用shell:初始化文件
《Unix & Linux 大学教程》 - 第十六、十七章 学习笔记   过滤器:简介和基本操作
《Unix & Linux 大学教程》 - 第十八章 学习笔记   过滤器:统计和格式化
《Unix & Linux 大学教程》 - 第十九章(一) 学习笔记   过滤器:选取、排序、组合及变换
《Unix & Linux 大学教程》 - 第十九章(二)、第二十章 学习笔记 过滤器:选取、排序、组合及变换 正则表达式
《Unix & Linux 大学教程》 - 第二十一章 学习笔记 显示文件
《Unix & Linux 大学教程》 - 第二十二章(一) 学习笔记 vi文本编辑器(一)
《Unix & Linux 大学教程》 - 第二十二章(二) 学习笔记 vi文本编辑器(二)
《Unix & Linux 大学教程》 - 第二十二章(三) 学习笔记 vi文本编辑器(三)
《Unix & Linux 大学教程》 - 第二十三章 学习笔记 Unix文件系统
《Unix & Linux 大学教程》 - 第二十四章 学习笔记 目录操作
《Unix & Linux 大学教程》 - 第二十五章 学习笔记 文件操作
《Unix & Linux 大学教程》 - 第二十六章(一) 学习笔记 进程和作业控制
《Unix & Linux 大学教程》 - 第二十六章(二) 学习笔记 进程和作业控制




第十九章:过滤器:选取、排序、组合及变换

第十九章第一部分


基础知识

程序/命令

grep(re代表regular expression,正则表达式;g代表global,全局;p代表print,打印)

语法

grep [-cilLnrsvwxpattern [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

log 写道
No such file or directory
Permission denied

fgrep:快速版本的grep,只搜索“固定字符”的字符串,不允许使用正则。

egrep:grep的扩展版本,原始的grep只允许基本的正则表达式,egrep支持功能更强大的“扩展正则表达式”。(第20章讨论他们的区别)

使用grep -E和egrep允许使用扩展正则表达式。



look

语法

look [-dfpattern 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 field2file1 file2

field1和field2是引用特定字段的数字

file1和file2是包含有序数据的文件的名称

join像是数据库中的联合查询(当然,也不是那么智能,两个文件内容都需要有序)

假设我们有这样两个文件name和age,其中name文件中有每个人的id和name,age文件中有每个人的id和age。

name age
1 a
2 b
3 c
5 e
4 d
1 34
2 43
3 12
5 23
4 26

默认情况下,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/


你可能感兴趣的:(JOIN,JOIN,linux,linux,linux,unix,正则表达式,File,File)