第12章管道与过滤器_第1页
第12章管道与过滤器_第2页
第12章管道与过滤器_第3页
第12章管道与过滤器_第4页
第12章管道与过滤器_第5页
已阅读5页,还剩25页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第12章 管道和过滤器 通过前一章的学习,我们已经知道了怎样从文件重定向输入,和重定向输出到文件。Shell还有一种功能,就是可以将两个或多个程序连接到一起,以使一个程序的输出变为下一个程序的输入,以这种方式连接的两个或多个程序就形成了管道。管道通常用于执行一些复杂的数据处理操作。这些命令之间使用控制操作符(管道符)“|”(竖线)连接。管道的语法格式如下所示: $ command1 | command2 $ command1 | command2 | commandN 当在两个命令之间设置管道时,管道符“|”左边命令的标准输出就变为了管道符“|”右边命令的标准输入。只要第一个命令向标准输出写入

2、,而第二个命令是从标准输入读取,那么这两个命令就可以形成一个管道。大部分的Linux命令都可以用来形成管道。12.1.1 操作符|和之间的区别 乍看起来,可能很难理解,由管道符|执行的重定向与由重定向操作符执行的重定向之间有什么不同。简单地说,重定向操作符将命令与文件连接,而管道符|将第一个命令的输出与第二个命令的输入连接。即,其含义的区别如下所示: $ command1 file1 $ command1 | command2 大部分的人学习管道时会尝试如下命令,我们来看一下会发生什么: $ command1 command2 答案是,有时尝试的结果将会很糟糕。12.1.1 操作符|和之间的区

3、别 这是一个实际的案例,一个Linux系统的管理员以超级用户的身份执行了如下命令: # cd /usr/bin # ls less 第一个命令是将当前目录切换到了大多数程序所存放的目录,而第二个命令是告诉Shell用ls命令的输出重写文件less。因为/usr/bin目录已经包含了名称为less(less程序)的文件,第二个命令用ls输出的文本重写了less程序,因此破坏了文件系统中的less程序。 这是使用重定向操作符误操作重写文件的一个教训,所以在使用它时要谨慎。12.1.2 为什么使用管道 我们先看下面一组命令,使用mysqldump这个数据库备份程序来备份一个叫做wiki的数据库: $

4、 mysqldump -u root -p password wiki /tmp/wikidb.backup $ gzip -9 /tmp/wikidb.backup $ scp /tmp/wikidb.backup userbackupserver:/backup/mysql/ 上述这组命令主要做了如下内容: mysqldump命令用于将名称为wiki的数据库备份到文件/tmp/wikidb.backup。 gzip命令用于压缩大的数据库文件以节省磁盘空间。 scp命令用于将数据库备份文件拷贝到远程的名称为backupserver的备份服务器。 上述三个命令依次地运行。然而,如果使用管道的话

5、,你就可以将mysqldump命令与gzip命令和ssh命令相连接,这样就避免了创建临时文件/tmp/wikidb.backup,而且可以同时执行这些命令并达到相同的效果。12.1.2 为什么使用管道 使用管道后的命令如下所示: $ mysqldump -u root -ppassword wiki | gzip -9 | ssh userbackupserver cat /home/user/mysql/wikidb.gz 上述使用管道的命令具有如下特点: 命令的语法紧凑并且使用简单。 通过使用管道,将三个命令串联到了一起就完成了远程mysql备份的复杂任务。 从管道输出的标准错误会混合到一

6、起。12.1.3 实例:使用管道连接程序 通过本章前面内容的学习,我们已经知道了,管道符是竖线“|”,使用这一操作符我们就可以将命令连接起来。例如,在下面的例子中,我们将ls命令的输出发送到grep命令: $ ls | grep data.txt 上述命令是查看文件data.txt是否存在于当前目录下。 我们可以在命令的后面使用命令的选项或参数。例如,我们查看当前目录下是否有.bashrc文件: $ ls -al | grep .bashrc -rwxr-xr-x 1 yantaol group 12 Oct 10 12:52 .bashrc 管道符“|”与两侧的命令之间也不可以不存在空格。比

7、如,上述命令还可以写为类似如下所示: $ ls -al|grep .bashrc -rwxr-xr-x 1 yantaol group 12 Oct 10 12:52 .bashrc12.1.3 实例:使用管道连接程序 然而,我还是推荐在管道符“|”和两侧的命令之间使用空格,以增加代码的可读性。 我们也可以重定向管道的输出到一个文件。比如,我们将上述管道命令的输出结果发送到文件/tmp/output.log中: $ ls -al | grep .bashrc /tmp/output.log 下面我们再来通过一些实例来学习,如何使用管道来连接程序。12.1.4 实例:管道中的输入重定向 输入重定

8、向操作符可以在管道中使用,以用来从文件中获取输入。其语法类似如下所示: command1 input.txt | command2 command1 或将管道中最后一个命令的标准输出进行重定向。其语法类似如下所示: $ command1 | command2 | | commandN output.txt $ command1 output.txt 我们已经知道,将几个命令通过管道符组合在一起就形成一个管道。通常,通过这种方式被使用的命令就被称为过滤器。过滤器会获取输入,通过某种方式修改其内容,然后将其输出。 简单地说,过滤器可以概括为以下两点: 如果一个linux命令是从标准输入接收它的输入

9、数据,并在标准输出上产生它的输出数据(结果),那么这个命令就被称为过滤器。 过滤器通常与Linux管道一起使用。 常用的被作为过滤器使用的命令如下所示: awk 用于文本处理的解释性程序设计语言,通常被作为数据提取和报告的工具。 cut 用于将每个输入文件(如果没有指定文件则为标准输入)的每行的指定部分输出到标准输出。 grep 用于搜索一个或多个文件中匹配指定模式的行。 tar 用于归档文件的应用程序。 head 用于读取文件的开头部分(默认是10行)。如果没有指定文件,则从标准输入读取。 paste 用于合并文件的行。 sed 用于过滤和转换文本的流编辑器。 sort 用于对文本文件的行进

10、行排序。 split 用于将文件分割成块。 strings 用于打印文件中可打印的字符串。 tac 与cat命令的功能相反,用于倒序地显示文件或连接文件。 tail 用于显示文件的结尾部分。 tee 用于从标准输入读取内容并写入到标准输出和文件。 tr 用于转换或删除字符。 uniq 用于报告或忽略重复的行。 wc 用于打印文件中的总行数、单词数或字节数。 接下来,我们来学习如何在管道中使用这些命令。12.2.1 实例:在管道中使用awk命令 我们将在第14章详细介绍awk命令的使用,在这一节中,我们仅通过几个简单的实例来了解一下awk命令在管道中的使用。12.2.2 实例:在管道中使用cut

11、命令 cut命令被用于文本处理。你可以使用这个命令来提取文件中指定列的内容。12.2.3 实例:在管道中使用grep命令 grep命令是在管道中比较常用的一个命令。12.2.4 实例:在管道中使用tar命令 tar命令是Linux系统中最常用的打包文件的程序。12.2.5 实例:在管道中使用head命令 有时,你不需要一个命令的全部输出,可能只需要命令的前几行输出。这时,你就可以使用head命令,它只打印命令的前几行输出。默认的输出行数为10行。12.2.6 实例:在管道中使用paste命令 paste命令用于合并文件的行,当然,它也可以通过管道接收其它命令的输出,并对其内容进行相应的合并处理

12、。12.2.7 实例:在管道中使用sed命令 我们将在第14章详细介绍sed命令的使用,在这一节中我们将通过几个简单的实例来了解一下sed命令在管道中的使用。 sed命令是流编辑器(stream editor)的简称。12.2.8 实例:在管道中使用sort命令 sort命令用于对文本文件的行进行排序,当然,它也可以通过管道对其它命令输出的行进行排序。12.2.9 实例:在管道中使用实例:在管道中使用split命令命令 split命令用于将文件分割成块,同样,也可以通过管道将其它命令输出的内容分割成指定大小的块并存入指定前缀的文件中。12.2.10 实例:在管道中使用strings命令 str

13、ings命令用于打印文件中的可打印字符串,常用来与grep命令配合使用,在二进制文件中查找字符串。12.2.11 实例:在管道中使用tail命令 tail命令用于打印文件的最后几行,同样,也可以通过管道显示其它命令输出的最后几行内容。12.2.12 实例:在管道中使用tee命令 tee命令用于(在同一时间)存储和查看任意其它命令的输出。使用tee命令,你可以从一个输入流读取输入,并分隔输出流到两个重定向,所以输出即显示在屏幕(标准输出)上也同样重定向到一个文件中。12.2.13 实例:在管道中使用tr命令 tr命令用于转换和删除字符。12.2.14 实例:在管道中使用uniq命令 uniq命令用于报告或删除重复的行:12.2.15 实例:在管道中使用wc命令 wc命令用于统计包含在文本流中的字符数、单词数和行数。12.3 小结 下面我们总结一下本章所学的主要知识: 管道:将两个或多个程序连接到一起,以使一个程序的输出可以变为下一个程序的输入,以这种方式连接的两个或多个程序就形成了管道。 重定向操作符将命令

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论