过滤器:简介和基本操作
2015-10-20 13:43
197 查看
这篇文章的内容来源于《Unix & Linux大学教程》的十六章,是自己看完这一章以后的记录。
cat可以用来显示一个文件的内容,同时它还可以组合文件。如下:
第一条语句是显示三个文件的内容,第二条语句则是将三个文件的内容组合在一起并写入info文件中。最后一条语句是在组合三个文件的内容以后,通过管道交给sort程序进行排序。(从过滤器的定义可以看出sort也是一个过滤器)。
注意点:在使用cat组合文件的时候,不要把输出重定向到一个输入文件中。比如,如果你想将文件address和文件phone中的数据追加到文件name中。那么你可能会想这么做:
这么做你会丢失name文件中的内容,因为在程序将标准输出重定向到一个文件之前,shell必须确保这个文件存在并且是空的。如果文件不存在,那么它会创建这个文件,如果这个文件存在,那么它会清空这个文件的内容。在上面的例子中,当cat准备好读取name文件的内容时,name文件的内容已经被清空了。当你输入上面的命令时,你会得到下面这样的信息:
这看上去像是一个警告信息,但这时候其实你的name文件的内容已经丢失了。
下面介绍几个cat的常用选项:
二.split
上面我们介绍了如何用cat组合多个文件,这里的split程序正好相反,是把一个大文件拆分为几个小文件。比如现在有一个57984行的文件data,我想把它拆成几个小文件。
默认的情况(不指定任何参数),split程序会把文件拆成1000行的小文件。所以上面这个文件会被拆成58个小文件。其中57个文件包含1000行的数据,最后一个文件包含了984行数据。这些文件的文件名都以x开头,后面跟两个字符的后缀。后缀是从aa, ab, ac…zz。所以这些文件分别为:xaa xab ….这样默认最多有676个文件。如果不喜欢字母后缀可以用-d选项,指定文件名后缀使用数字。这样这些文件就便成了x00 x01 x02…如果不喜欢x开头的名字也可以自己指定名字。如下命令:
data这个文件会被分为harley00 harley01 harley02…,如果你觉得100个文件(数字后缀),或者是676个文件(字母后缀)不够用的话,该怎么办呢?你可以通过-a选项指定后缀的位数。比如下面的命令会使用三个字母后缀。
最后再介绍一个-l选项,这也是一个很重要的选项。-l后面跟着一个数字可以指定每个拆分文件的长度,这个长度默认是1000。希望可以自己思考一下下面的命令的每个选项的作用,和最后会得到怎么样的效果。
三.tac
tac程序也是一个组合文件的程序,那它和cat有什么区别呢?通过观察你会发现这两个单词刚好就是反过来,它的功能呢就是将一个文件反转文本行。效果如下:
那这个奇怪的程序难道只是为了好玩吗?当然不是,在查看log文件时,这个命令就非常方便,我们不需要从最上面往下看。直接从最新的log往上看。命令如下:
四.rev
前面介绍了行反转程序,那么自然而然就想到了字符反转,这个命令就是rev。如下:
五.head, tail
这里是两个程序,为什么这两个程序要放在一起呢?因为他们的作用和用法都差不多,只不过一个是显示文件头部的数据,一个是显示文件尾部的数据。如果不指定任何参数,那么它们都默认显示10行数据。当然也可以用-n选项,指定你要查看的数据行数。示例如下:
六.colrm
行操作的命令很多,但是很少看见有对文件进行列操作的。而这个程序的作用就是删除指定的数据列,然后将剩余数据写入标准输出。看下面的例子:
如果指定两个参数,那么会把这两列之间(包括这两列)的数据删除,注意这里面有空格,也是一列。如果只指定一个参数,那么这一列以后的所有数据都会被删除。
什么是过滤器
过滤器的定义是从标准输入读取数据,经过处理以后向标准输出写入数据(每次一行)的程序。而cat就是最简单的过滤器,因为这个程序就是把从标准输入读取的数据不经过任何处理输出到标准输出。几个常用的过滤器
一. catcat可以用来显示一个文件的内容,同时它还可以组合文件。如下:
cat name address phone cat name address phone > info cat name address phone | sort
第一条语句是显示三个文件的内容,第二条语句则是将三个文件的内容组合在一起并写入info文件中。最后一条语句是在组合三个文件的内容以后,通过管道交给sort程序进行排序。(从过滤器的定义可以看出sort也是一个过滤器)。
注意点:在使用cat组合文件的时候,不要把输出重定向到一个输入文件中。比如,如果你想将文件address和文件phone中的数据追加到文件name中。那么你可能会想这么做:
cat name address phone > name
这么做你会丢失name文件中的内容,因为在程序将标准输出重定向到一个文件之前,shell必须确保这个文件存在并且是空的。如果文件不存在,那么它会创建这个文件,如果这个文件存在,那么它会清空这个文件的内容。在上面的例子中,当cat准备好读取name文件的内容时,name文件的内容已经被清空了。当你输入上面的命令时,你会得到下面这样的信息:
cat: name: input file is output file
这看上去像是一个警告信息,但这时候其实你的name文件的内容已经丢失了。
下面介绍几个cat的常用选项:
-n 在每行前面加上一个行号显示。 -b 一般和-n一起使用,告诉cat不要对空白的行进行编号。 -s 多个连续的空行只会显示一个。
二.split
上面我们介绍了如何用cat组合多个文件,这里的split程序正好相反,是把一个大文件拆分为几个小文件。比如现在有一个57984行的文件data,我想把它拆成几个小文件。
split data
默认的情况(不指定任何参数),split程序会把文件拆成1000行的小文件。所以上面这个文件会被拆成58个小文件。其中57个文件包含1000行的数据,最后一个文件包含了984行数据。这些文件的文件名都以x开头,后面跟两个字符的后缀。后缀是从aa, ab, ac…zz。所以这些文件分别为:xaa xab ….这样默认最多有676个文件。如果不喜欢字母后缀可以用-d选项,指定文件名后缀使用数字。这样这些文件就便成了x00 x01 x02…如果不喜欢x开头的名字也可以自己指定名字。如下命令:
split -d data harley
data这个文件会被分为harley00 harley01 harley02…,如果你觉得100个文件(数字后缀),或者是676个文件(字母后缀)不够用的话,该怎么办呢?你可以通过-a选项指定后缀的位数。比如下面的命令会使用三个字母后缀。
split -a 3 data
最后再介绍一个-l选项,这也是一个很重要的选项。-l后面跟着一个数字可以指定每个拆分文件的长度,这个长度默认是1000。希望可以自己思考一下下面的命令的每个选项的作用,和最后会得到怎么样的效果。
split -a 3 -d -l 100 data harley
三.tac
tac程序也是一个组合文件的程序,那它和cat有什么区别呢?通过观察你会发现这两个单词刚好就是反过来,它的功能呢就是将一个文件反转文本行。效果如下:
bearox$ cat data aaaaaa bbbbbb cccccc bearox$ tac data cccccc bbbbbb aaaaaa
那这个奇怪的程序难道只是为了好玩吗?当然不是,在查看log文件时,这个命令就非常方便,我们不需要从最上面往下看。直接从最新的log往上看。命令如下:
tac log | less
四.rev
前面介绍了行反转程序,那么自然而然就想到了字符反转,这个命令就是rev。如下:
bearox$ cat data 1 2 3 4 5 6 7 8 9 8 7 6 5 4 3 2 bearox$ rev data 4 3 2 1 8 7 6 5 6 7 8 9 2 3 4 5
五.head, tail
这里是两个程序,为什么这两个程序要放在一起呢?因为他们的作用和用法都差不多,只不过一个是显示文件头部的数据,一个是显示文件尾部的数据。如果不指定任何参数,那么它们都默认显示10行数据。当然也可以用-n选项,指定你要查看的数据行数。示例如下:
head -n 20 data
六.colrm
行操作的命令很多,但是很少看见有对文件进行列操作的。而这个程序的作用就是删除指定的数据列,然后将剩余数据写入标准输出。看下面的例子:
bearox$ cat data 1 2 3 4 5 6 7 8 9 8 7 6 5 4 3 2 bearox$ colrm 2 5 < data 1 4 5 8 9 6 5 2 bearox$ colrm 2 < data 1 5 9 5
如果指定两个参数,那么会把这两列之间(包括这两列)的数据删除,注意这里面有空格,也是一列。如果只指定一个参数,那么这一列以后的所有数据都会被删除。
相关文章推荐
- LabVIEW设计模式系列——状态机
- html 线条重叠变粗
- Ios学习-oc学习1记录
- 新人学ruby---alias,alias_method,alias_method_chain,undef,undef_method的区别
- Spring配置事务中的 transactionAttributes 各属性含义
- S2SH测试Dao类中的方法
- 影响力一:影响力的武器
- DerInputStream.getLength(): lengthTag=111, too big.
- iOS:授权用户定位NSLocationManager的使用
- [NOIP集训]10月20日
- ArcGIS教程:按掩膜提取 (空间分析)
- 自定义一个LTView对象,本身自带一个UILable和一个UITextField控件
- Node.js学习笔记之二:回调
- 补实验四及第二章家庭作业
- python执行linux的shell命令
- ThreadLocal 在web环境下使用的边界问题
- js手机界面调用安卓app
- 继承
- Linux 0.12内核与现代内核在内存管理上的区别
- rails中的正则表达式的相关错误提示