文本流和过滤器
本节讨论初级管理(LPIC-1)考试 101 的主题 1.103.2 的内容。这个主题的权值是 6。
在本节中,学习以下主题:
- 通过文本工具过滤器发送文本文件和输出流,从而修改输出
- 使用 GNU textutils 包中的标准 UNIX 命令
文本过滤
文本过滤 就是获取文本输入流,在文本上执行某些转换,然后将它发送到输出流的过程。尽管输入或输出可以是文件,但是在 Linux 和 UNIX 环境中,进行过滤的最常用方式是构造命令的管道,也就是对一个命令的输出进行管道连接(即 重定向),用作下一个命令的输入。管道和重定向将在 流、管道和重定向 一节中更完整地讨论,目前,我们来看看使用 | 和 > 操作符的管道和基本输出重定向。
用 | 构造管道
前面一节提到过,shell 使用三种标准 I/O 流:
- stdin 是标准输入流,它向命令提供输入。
- stdout 是标准输出流,它显示来自命令的输出。
- stderr 是标准错误流,它显示来自命令的错误输出。
在本教程中到目前为止,输入都是来自我们提供给命令的参数,输出都显示在终端上。许多文本处理命令(过滤器)可以从标准输入流或文件获得输入。要想将一个命令(command1)的输出用作一个过滤器(command2)的输入,应该使用管道操作符(|)连接这两个命令,如清单 20 所示。
Ug5Linux联盟
清单 20. 通过管道将 command1 的输出连接到 command2 的输入
正如在本节后面会看到的,这两个命令都可能有选项或参数。还可以使用 | 将这个管道中 command2 的输出重定向到另一个命令,command3。将功能有限的多个命令连接成长的管道是在 Linux 和 UNIX 上完成任务的常用方式。有时还会看到连字符(-)用来替代文件名作为命令参数,这意味着输入应该来自 stdin 而不是文件。
用 > 进行输出重定向
能够用几个命令创建管道并在终端上看到输出固然很不错,但是有时候希望将输出保存到文件中。这要使用输出重定向操作符(>)来完成。
对于本节的其余部分,我们将使用一些小文件,所以先创建一个称为 lpi103 的目录,然后进入这个目录。然后使用 > 把 echo 命令的输出重定向到 text1 文件。这些操作见清单 21。注意,输出没有显示在终端上,因为它被重定向到文件了。
Ug5Linux联盟
清单 21. 将 echo 命令的输出重定向到文件
[ian@echidna ian]$ mkdir lpi103
[ian@echidna ian]$ cd lpi103
[ian@echidna lpi103]$ echo -e "1 apple\n2 pear\n3 banana">text1
|
既然我们已经有了进行管道连接和重定向的基本工具,就来看一些常用的 UNIX 和 Linux 文本处理命令和过滤器。本节只展示一些基本功能;请通过适当的手册页进一步了解这些命令。
cat、tac、od 和 split
既然已经创建了 text1 文件,您可能想看看其中的内容。使用 cat(catenate 的简写)命令将文件的内容显示在 stdout 上。清单 22 检查上面创建的文件的内容。
Ug5Linux联盟
清单 22. 用 cat 显示文件内容
[ian@echidna lpi103]$ cat text1
1 apple
2 pear
3 banana
|
如果不指定文件名(或者指定 - 为文件名),那么 cat 命令从 stdin 接收输入。让我们使用这种方式和输出重定向来创建另一个文本文件,如清单 23 所示。
Ug5Linux联盟
清单 23. 用 cat 创建文本文件
[ian@echidna lpi103]$ cat>text2
9 plum
3 banana
10 apple
|
在清单 23 中,cat 从 stdin 读取输入,直到文件的末尾。使用 Ctrl-d(按住 Ctrl 并按下 d)组合键来表示文件的末尾。这个组合键也用来退出 bash shell。还要注意,制表符键帮助将这些水果名按列排列起来。
有时候,可能希望按相反的次序显示文件。很自然,也有一个用于此目的的文本过滤器,称为 tac(cat 的反序)。清单 24 按相反的次序显示新的 text2 文件和原来的 text1 文件。注意显示中如何简单地连接这两个文件。
Ug5Linux联盟
清单 24. 用 tac 进行反序显示
[ian@echidna lpi103]$ tac text2 text1
10 apple
3 banana
9 plum
3 banana
2 pear
1 apple
|
现在,假设使用 cat 或 tac 显示这两个文本文件并注意到对齐方式不一样。要了解造成这个问题的原因,需要看到文件中的控制字符。因为这些控制字符的作用是进行文本显示输出,而控制字符本身没有显示,所以需要将文件转储 为另一种格式,从而能够寻找和解释这些特殊字符。GNU 文本实用程序包含的 od(即 Octal Dump)命令用于这个目的。
od 有几个选项,比如 -A 选项用来控制文件偏移量的基数,-t 选项用来控制显示的文件内容的形式。基数可以指定为 o(八进制 - 默认)、d(十进制)、x(十六进制)或 n(不显示偏移量)。可以将输出显示为八进制、十六进制、十进制、浮点、用反斜线转义的 ASCII 或命名的字符(nl 表示新行,ht 表示水平制表符,等等)。清单 25 显示一些可以用来对 text2 示例文件进行转储的格式。
Ug5Linux联盟
清单 25. 用 od 对文件进行转储
[ian@echidna lpi103]$ od text2
0000000 004471 066160 066565 031412 061011 067141 067141 005141
0000020 030061 060411 070160 062554 000012
0000031
[ian@echidna lpi103]$ od -A d -t c text2
0000000 9 \t p l u m \n 3 \t b a n a n a \n
0000016 1 0 \t a p p l e \n
0000025
[ian@echidna lpi103]$ od -A n -t a text2
9 ht p l u m nl 3 ht b a n a n a nl
1 0 ht a p p l e nl
|
注意:
1. cat 的 -A 选项也可以用来查看制表符和行末的位置。更多信息参见手册页。
2. 如果您具有大型机背景,就可能对 hexdump 实用程序感兴趣,这是另一个实用程序集的一部分。这里不讨论它,请参考手册页。
我们的示例文件非常小,但是有时候有大型文件需要分割为比较小的块。例如,可能希望将大文件分割为 CD 容量的块,以便将它写到 CD 中。split 命令会完成这个任务,可以使用 cat 命令轻松地重新创建文件。在默认情况下,split 命令产生的文件的名称前面有前缀 'x',后面有后缀 'aa'、'ab'、'ac'、...'ba'、'bb' 等等。可以用选项控制这些默认前缀和后缀。还可以控制输出文件的大小,以及产生的文件是包含整行,还是只按字节计数。清单 26 演示将我们的两个文本文件进行分割,输出文件具有不同的前缀。我们将 text1 分割为最多包含两行的文件,将 text2 分割为最多包含 18 字节的文件。然后使用 cat 单独显示一些片段,并使用 globbing 显示完整的文件,这在本教程后面的 通配符和 globbing 一节中讨论。
Linux联盟收集整理 ,转贴请标明原始链接,如有任何疑问欢迎来本站Linux论坛讨论