为了有效地让 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 6月 7 10:08 1.txt
-rw-rw-r-- 1 sdxx09 sdxx09 0 6月 7 19:36 2.txt
-rw-rw-r-- 1 sdxx09 sdxx09 0 6月 7 19:36 3.txt
-rw-rw-r-- 1 sdxx09 sdxx09 18 6月 8 00:22 log.txt
drwxrwxr-x 2 sdxx09 sdxx09 4096 6月 8 00:32 news
drwxrwxr-x 2 sdxx09 sdxx09 4096 6月 8 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