摘要

为了有效地让 Linux 程序协同工作,我们需要对命令输入输出进行重定向(Redirection),并将一个命令的输出通过管道(Pipes)连接到另一个程序的输入。本文将介绍如何在 Linux 中使用管道。

引言

本质上,管道就是一种特殊的输入输出重定向。就是将一个命令的标准输出重定向为另一个命令的标准输入。在 Linux 系统中,完成复杂的任务往往需要构造命令管道。管道操作符是 |。构造管道很简单,只要使用管道操作符将命令连起来就行了。值得注意的是,管道操作符右边的命令必须能够接受标准输入流才行,但 Linux 中能够接受标准输入流的命令并不多,一般都是一些文本处理命令,常用的有:grep、cut、head、tail、less、more、wc、tr、sort 等等。

用法

grep 是一个非常强大的文本查找命令,可以使用正则表达式来匹配文本。其用法是:grep [关键字] [目标文件]

示例 1:将 ls 输出作为 grep 命令的输入,用于查找命令输出中带有 log 字样的文件名。

$ ls
1.txt  2.txt  3.txt  log.txt
$ ls | grep "log"
log.txt

cut 是文本切割命令,用于切割文本文件或标准输出中的指定列。cut 可以使用 -c 选项按字符切割文本。-c 选项后面紧跟的数字表示切割的字符列序号。支持切割多列,用逗号隔开即可。

示例 2:将 cat 命令的输出作为 cut 命令的输入,用于切割命令输出中第 1 列和第 2 列。

$ cat log.txt
1.txt
2.txt
3.txt
$ cat log.txt | cut -c 1,2
1.
2.
3.

示例 3:将 cat 输出作为 cut 命令的输入,用于切割命令输出中按照指定分割符分割的文本的第 2 个字段。

$ cat log.txt
1.txt
2.txt
3.txt
$ cat log.txt | cut -f 2 -d .
txt
txt
txt

wc 是文本统计命令。可以统计文本文件或标准输出中的文本行数,单词数和字节数。-l 选项仅仅统计文本行数。

示例 4:统计当前工作目录下目录的数目。(当前工作目录下仅有 news 和 test 两个目录,因此输出为 2)

$ ls -l
总用量 12
-rw-rw-r-- 1 sdxx09 sdxx09    0 67 10:08 1.txt
-rw-rw-r-- 1 sdxx09 sdxx09    0 67 19:36 2.txt
-rw-rw-r-- 1 sdxx09 sdxx09    0 67 19:36 3.txt
-rw-rw-r-- 1 sdxx09 sdxx09   18 68 00:22 log.txt
drwxrwxr-x 2 sdxx09 sdxx09 4096 68 00:32 news
drwxrwxr-x 2 sdxx09 sdxx09 4096 68 00:32 test
$ ls -l | cut -c 1 | grep d | wc -l
2

示例 5:管道不会传递错误输出。因为当前工作目录下没有 logs 目录,因此执行 ls -l ./logs 会报错,但是该错误却不会向其后的命令传递,保证了管道仍然能够正常工作,输出正确定结果 2。

$ ls -l . ./logs | cut -c 1 | grep d | wc -l
ls: 无法访问 './logs': 没有那个文件或目录
2

参考

中国大学 MOOC | Linux 系统管理 | 主题 05 重定向与管道 | 小节 2 管道

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐