目标
完成这一章,你能够做以下事情:
※了解管道的用途。
※建立一个管道,使其从一个命令获得输出,然后为另一个命令制造输入。 ※使用tee,cut,tr,more,和pr过滤器
10.1 管道简介
shell提供的一个有用的特性是通过管道将命令连接起来的能力。UNIX系统操作环境的灵活性通过过滤文件的内容来体现。使用管道,你能够过滤一个命令的输出。
这一章会介绍管道,然后介绍一些过滤器(cut,tr,tee和pr),这样你就能对文件或命令的输出作进一步的处理。
10.2 为什么使用管道
$ who > temp_file
$ wc -l < temp_file?????????
$ rm temp_file
who | wc -l
如果你使用I/O重定向来完成过滤一个命令的输出的操作,你会首先重定向一个命令的输出到临时文件然后过滤这个临时文件的内容。当你完成这些操作,你又要删除这个临时文件。虽然这种方式扩展了命令的能力,但是删除临时文件的操作显得不是很方便。
管道让你直接传送一个命令的输出到另一个命令的输入。你不需要创建一个临时文件;因此,当你完成操作的时候不需要进行清除操作。
这就是UNIX系统的灵活和强大的具体体现。命令和命令可以被链接在一起,提高了单个命令行的处理能力。
10.3 | 符号
|
符号(读成管道符)的作用是联接两个命令。管道符左边命令的标准输出会被用作管道符右边的命令的标准输入。出现在管道中间的命令,必须能够接收标准输入和输出到标准输出。
过滤器例如wc,sort,和grep接收标准输入并产生标准输出,所以,它们可以出现在一个管道的中间。通过将命令和过滤器链接到一起,使你能够执行非常复杂的过程。
以下是管道的每一个位置的命令的要求:
※任何在一个|符号左边的命令必须能够输出到标准输出。
※任何在 | 符号右边的命令必须能够从标准输入读取数据。
※任何在两个 | 符号之间的命令必须能够接收标准输入并且能够制造输出到标准输出。(是一个过滤器)
more 命令
more 命令被用来在屏幕上显示文件的内容,一次显示一屏。more
命令同样也能读取标准输入。因此,它能出现在一个管道的右边,被用来控制任何命令的输出,并且产生输出到标准输出。这在一个命令在你的屏幕上产生很长的输出,你想要一次浏览一屏的时候非常有用。
10.4 管道与输入输出重定向
输入输出重定向 ??????管道
语法:
cmd_out > file ??????cmd_out | cmd.in
or
cmd_in < file
例子:
who > who.out ???????who | sort
sort < who.out
输入输出重定向总是在一个命令和一个文件之间进行。输出重定向会捕获一个命令的标准输出,并且把它输出到一个文件。输出重定向一般用来记录日志或者长时间地存贮一个命令的输出数据。输入重定向将输入从键盘变成从文件。输入重定向执行起来不是很明确,因为大多数的命令接收标准输入,同样也接收文件名作为命令行参数(mail和write除外)。但是具备输入重定向的能力是一个命令能出现在一个管道符号的右边的必须要求。
管道通常被用来联接两个命令。如果你想要使用一个接收标准输入的命令来进一步处理一个命令的输出,应该建立一个管道。输入输出重定向被用来在命令和文件之间。管道被用来在命令之间
10.5 管道中的重定向
每一个命令都有三个有效的数据流:标准输入,标准输出,标准错误。管道中的每一个命令都保留有某一个流。而没有被管道使用的流可以被重定向。
以下是一个管道的不同部分的重定向的有效性的一个汇总:
※任何在一个管道符号的左边的命令能够被重定向输入,和错误,因为它的输出被传送到管道右边的命令。
※任何在一个管道右边的命令能够被重定向输出,和错误。因为它的输入来自管道中前一个命令。
※任何在管道中间的命令能重定向错误,因为它的输入来自前一个命令而它的输出要送到管道中的下一个命令。
例子:
$ grep user /etc/passwd | sort > sorted.users
$ grep usesr < /etc/passwd 2> grep.err | sort > sorted.users 2>
sort.err
$ grep user < /etc/passwd | sort 2 > sort.err | wc –l > wc.out 2>
wc.err
上例中的输出会送到一个文件,在屏幕上不能看到标准命令的输出。
10.6 一些过滤器
cut ???抽取指定的列或者字段。并且显示在屏幕上。
tr ????转换字符
tee ???输出到一个文件同时输出到标准输出。
pr ???打印并且格式化输出到标准输出
过滤器如sort,或者grep,提供了一种灵活的机制来对命令的输出进行处理。这一章剩下的部分介绍在管道中执行三种新的过滤器。像其他的过滤器一样,这些命令接收标准输入,所以它们可以出现在一个管道的右边,同时它们产生标准输出,所以它们同样能出现在管道的左边(或者在一个管道的中间)
cut命令允许你从标准输入或者一个文件中抽取出文本的列或者是字段,然后将结果送到标准输出。
tee命令允许你将命令的输出送到一个文件和标准输出。
pr命令被用来格式化输出,通常被用来准备输出一个文件到打印机。
正如所有的过滤器一样,这些命令不会修改原始文件的内容。处理的结果会被送到标准输出。
10.7 cut 命令
语法:
cut -clist [file...] 从文件或标准输入抽取列或者字段
cut -flist [-dchar][-s][file...]
例子:
$ date | cut –c1-3
$ tail –1 /etc/passwd
user3:mdhbmkdj:303:30:student user3:/home/user3:/usr/bin/sh
1 ???2 ????3 ?4??? 5???? ???6????? 7
$ cut –f1,6 –d: /etc/passwd |
$ cut –f1,6 –d: /etc/passwd | sort –r
$ ps –ef | cut –c49- | sort –d
cut 命令被用来从标准输入或者一个文件中抽取特定的列或者字段。被抽取的列或字段会被送到标准输出。-c
选项剪切列,-f选项剪切字段。cut命令能从标准输入或者一个文件接收输入,由于它接收标准输入,所以它可以出现在一个管道的右边。
一个数字列表被用来告诉cut要抽取得哪些列或字段。列的定义同sort命令类似。定义列或者字段列表有以下的格式:
A-B 从A到B的列或者字段
从A到列或字段的最后一行
-B 从列或字段的开头到B
A,B 字段A或者B
以上的格式也可以组合在一起使用,例如:
cut -f1,3 5-7 /etc/passwd
会剪切出/etc/passw文件的第一和第三列,和第五行到第七行。
默认的字段分隔符为tab符号。如果你要用其他的分隔符,你可以使用-d char
选项,其中char是分割你的输入的字段的字符。(这类似于sort命令的-t
X选项)。冒号是一个通用的分隔符,因为它在shell中没有什么特殊含义。
同样,-s选项,在剪切字段的时候,会丢弃所有的没有分隔符的行。
例子:
$ cut –c1-3 回车
12345
123
abcdefgh
abc
ctrl + d
$ date | cut –c1-3
10.8 tr 命令
语法:
tr [-s] [string1] [ string2] ?????转换字符
例子:
$ who | tr –s “ “
$
$ date | cut –c1-3 | tr “ [:lower:] “ “ [:upper:] “
tr命令的作用是转换字符。它接收标准输入也接收文件名作为参数;因此它能被用在管道中。
tr命令可以用来转换许多连续的空白字符为一个空白字符,如上例所示。你也许注意到许多的UNIX命令会在它们的字段之间插入一定数量的空白。因此,当你想要在字段之间使用一个单个的分割符号的时候,在一个管道中的tr能够方便地进行一次前期处理,。
tr命令同样能够被用来替代文字的字符或者转换文本的大小写,就象上例中的第二个例子。
10.9 tee命令
语法:
tee [-a] file [file...] 分流管道
例子:
$ who | sort
$ who | tee unsorted | sort
$ who | tee unsorted | sort | tee sorted
$ who | wc –l
$ who | tee whoson | wc –l
????标准输入---》 ???---》标准输出
?????????????|
???????????? 文件?
通常你在执行一个复杂的管道操作的时候,管道中间的命令的输出被提交到管道中的下一个命令处理,这时你不能够看到中间命令的输出。tee命令被用来分接一个管道。Tee从标准输入读取数据,然后输出到标准输出,同时输出到一个指定的文件。如果使用-a
选项,tee会在文件末尾添加输出而不是覆盖文件。
tee命令适合在两种环境中使用。
※从管道收集中间命令的输出:
?当你在一个管道中加入tee,你就可以捕捉中间处理,然后传送到管道的下一个命令。
?发送一个命令的最后的输出到屏幕同时到一个文件。
※这是一个有用的日志机制。你也许想要交互运行一个命令并且观察它的输出,同时要保存这个输出到一个文件。请记住,当你仅仅重定向一个命令的输出到文件的时候,在屏幕上是没有显示。所以,这个工具能被用在管道的最后,或者在任何产生输出的命令的最后。
10.10 pr 命令
语法:
pr [ -option] [file....] 对标准输入格式化并且产生标准输出
例子:
$ pr –n3 funfile
$ pr –n3 funfile | more
$ ls | pr –3
$ grep home /etc/passwd | pr –h “user Accounts”
pr
命令可以打印到标准输出:它被用来格式化标准输入数据流或者格式化指定文件的内容。然后输出到屏幕,而不是到打印机,pr命令典型的执行情况是,在文件被送到打印机打印前格式化文件的内容。
pr 命令在打印长文件的时候非常有用,因为它会在每一个新页的顶部插入一个标题,其中包括文件名(或者是使用-h选项定义的标题),和页号。
pr命令支持许多的选项。你可以使用man来查找每个选项的具体用途。
10.11 管道-总结
管道 cmd_out | cmd_in
cmd_out | cmd_in_out | cmd_in
cut 抽取列或者字段输出到标准输出
tee 发送输出到标准输出同时到一个指定的文件
pr 在屏幕上格式化打印信息,通常和lp一起使用。
tr 转换字符
阅读(769) | 评论(0) | 转发(0) |