在学习Linux管道之前,我们首先需要了解流的概念:
流 只不过是一个可以使用库功能读取或写入的字节序列,库功能向应用程序隐藏了底层设备的细节。通过使用流,相同的程序可以使用独立于设备的方式从终端、文件或网络 socket 中读取,或向其中写入。
Linux shell 使用 3 种标准的 I/O 流,每种流都与一个文件描述符相关联:
1.stdin ,标准输入流,它为命令提供输入。它的文件描述符为 0。
2.stdout ,标准输出流,它显示来自命令的输出。它的文件描述符为 1。
3.stderr ,标准错误流,它显示来自命令的错误输出。它的文件描述符为 2。
输入流通常通过终端击键为程序提供输入。输出流通常向终端输出文本字符。最初的终端是 ASCII 打字机或显示终端,但现在更多是指图形桌面上的文本窗口。
许多文本处理命令(过滤器)可以从标准输入流或从文件中获取输入,如果想将命令 command1 的输出作为过滤器 command2 的输入,这个时候需要使用管道符 (|) 连接两个命令:
command1 parameter1 | command2 parameter2
上面的例子中,command1的标准输出流被管道导入/重定向为command2的标注输入流
管道操作符具有如下特点:
(1)管道只能处理前一命令的标准输出流,无法处理标准错误流;
(2)管道符右边的命令必须能够接受标准输入流作为输入才行;
管道符右边的常用命令如下:
选取命令:cut,grep
排序命令:sort,wc,uniq
双重数据量:tee
字符转换命令:tr,expand,col
切割命令:split
参数代换:xargs
使用文件作为管道命令的起始输入:
方法1:使用cat命令将需要处理的文件输出至stdout,然后作为第一个命令的标准输入:
cat file | command1 parameter1 | command2 parameter2
方法2:对第一个命令使用<操作符将输入重定向为需要处理的文件,然后在剩余的管道下中导出该命令的输出
command1 < file | command2 parameter2
附重定向命令使用方法:
command > file | 将输出重定向到 file。 |
command < file | 将输入重定向到 file。 |
command >> file | 将输出以追加的方式重定向到 file。 |
n > file | 将文件描述符为 n 的文件重定向到 file。 |
n >> file | 将文件描述符为 n 的文件以追加的方式重定向到 file。 |
n >& m | 将输出文件 m 和 n 合并。 |
n <& m | 将输入文件 m 和 n 合并。 |
<< tag | 将开始标记 tag 和结束标记 tag 之间的内容作为输入。 |
此处文件描述符 0 是标准输入(STDIN),1 是标准输出(STDOUT),2 是标准错误输出(STDERR)。
本文参考:
https://www.ibm.com/developerworks/cn/linux/l-lpic1-v3-103-2/
https://www.ibm.com/developerworks/cn/linux/l-lpic1-v3-103-4/index.html
http://wiki.jikexueyuan.com/project/learn-linux-step-by-step/pipe-command.html
http://www.runoob.com/linux/linux-shell-io-redirections.html