学习 Linux,101: 流、管道和重定向(6)

在文章  “学习 Linux,101:文本流和过滤器 ” 中,我们这样描述文本过滤:接收文本输入流并对文本执行一些转换,然后在发送到输出流的过程。这种过滤通常是通过构造命令管道线 来完成的,其中来自一个命令的输出被导入 或重定向 为下一个命令的输入。管道的这种使用方式并不局限于文本流,尽管这是它的最常见用法。

通过管道将 stdout 导入到 stdin

在两个命令之间使用管道 | 操作符将的一个命令的 stdout 指向第二个命令的 stdin。您可以通过添加更多的命令和管道操作符来构造更长的管道线。任何命令都可能包含选项或参数。许多命令使用连字符 (-) 取代文件名作为一个参数,用于表示输入来自 stdin 而不是文件。查看手册页确保正确使用命令。构造由多个命令(每个命令都有特定的功能)组成的长管道线是在 Linux 和 UNIX? 中用于完成任务的常见方法。在清单 10 的假设管道线中,command2 和 command3 都带有参数,但 command3 仅使用 - 参数表示来自 stdin 的输入。


清单 10. 通过管道从几个命令导出输出
command1 | command2 paramater1 | command3 parameter1 - parameter2 | command4  

需要说明的是,管道线将 stdout 导向 stdin。您不能使用 2| 单独导出 stderr,至少使用我们目前所了解的工具还不能这样做。如果 stderr 已被重定向到 stdout,那么两个流都会被通过管道导出。在清单 11 中,我们展示了一个不太现实的 ls 命令,它有 4 个不是按字母顺序出现的通配符参数,然后使用一个管道对包含正常和错误输出内容的进行分类。


清单 11. 使用管道导出两个输出流
[ian@echidna lpi103-4]$ ls y* x* z* u* q* ls: cannot access z*: No such file or directory ls: cannot access u*: No such file or directory ls: cannot access q*: No such file or directory xaa xab yaa yab [ian@echidna lpi103-4]$ ls y* x* z* u* q* 2>&1 |sort ls: cannot access q*: No such file or directory ls: cannot access u*: No such file or directory ls: cannot access z*: No such file or directory xaa xab yaa yab  

Linux 和 UNIX 系统中的管道的优点之一是,与其他流行的操作系统不同,它们的管道不涉及到中间文件。第一个命令的 stdout 没有到一个文件中,然后再由第二个命令读取。在文章 “学习 Linux,101: 文件和目录管理 ” 中,您学习了如何使用 tar 命令在一个步骤中归档和压缩文件。即使您使用的 UNIX 系统的 tar 命令不支持使用 -z(gzip)或 -j(bzip2)进行压缩也不成问题。您可以使用这样的管道

bunzip2 -c somefile.tar.bz2 | tar -xvf -

完成该任务。

使用文件而不是 stdout 开始管道线

在以上的管道线中,我们在开始时使用一些生成输出的命令,然后通过管道线的每个阶段导出输出。如果我们要以现有的文件开始,应该怎么办呢?许多命令都接受 stdin 或文件作为输入,因此这不成问题。如果您有要求来自 stdin 的输出的过滤器,那么可以考虑使用 cat 命令将文件复制到 stdout。不过,您可以对第一个命令使用输入重定向,然后在剩余的管道下中导出该命令的输出,这是更加常见的解决方案。仅需使用 < 操作符将第一个命令的 stdin 重定向到需要处理的文件。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/27839.html