重定向与管道
重定向
所谓输入/输出文本流很容易理解,Linux 通过 Shell 与用户进行交互。而 Shell 正是使用输入流向程序提供输入,常常指的是终端键盘;而用输出流在终端上显示程序输出,以前往往指的是 ASCII 打字机或终端显示屏,现在一般是图形桌面上的窗口。不过确切来说,Bash 实际上使用三种标准输入输出流:
- 标准输出流(stdout),显示来自命令的输出,文件描述符是 1。
- 标准错误输出流(stderr),显示来自命令的错误输出,文件描述符是 2。
- 标准输入流(stdin),向命令提供输入,文件描述符是 0。
对于任何一条 linux 命令执行,它会是这样一个过程:
这些默认的输出,输入都是默认,我们在使用过程中,有时候并不希望执行结果输出到屏幕,例如我们想将结果输出到文件或其它设备或者简单丢弃。这个时候我们就需要进行输出重定向了。简单来说,输出重定向指的就是将某个程序默认指向 stdout 或者 stderr 的输出文本流转而指向另一个文件,也即程序输出到某个指定文件中而不是输出到终端屏幕或者终端窗口中了。
对输出进行重定向有两种方法: - n> ,表示将来自文件描述符 n 的输出重定向到文件。必须对这个文件有写权限。如果文件不存在,就创建它。如果它存在,将覆盖原有文件内容;
- n>>,也表示将来自文件描述符 n 的输出重定向到文件。同样,必须对这个文件有写权限。如果文件不存在,就创建它。如果它存在,输出就附加到现有文件后面。
注意:有时候希望完全忽略标准输出或标准错误。为此,可以把适当的流重定向到 /dev/null 中。
/dev/null类似于回收站,该文件永远处于空
管道
本质上来说,管道就是一种特殊的重定向,也就是对一个命令的输出进行管道连接(即重定向),用作下一个命令的输入。在 Linux 环境中,命令协作最常用方式就是构造命令管道。
前一个命令的输出为下一个命令的输入
例:
- ls -lh ./ | less 用less阅读ls的输出
- ls -lh ~ | cut -c1 | grep “d” 查看家目录下文件夹的数目
重定向与管道在使用时候很多时候可以通用,其实,在 shell 里面,经常是【条条大路通罗马】的。一般如果是命令间传递参数,还是管道的好,如果处理输出结果需要重定向到文件,还是用重定向输出比较好。
常用来作为接收数据管道命令有:sed, awk, cut, head, tail,top, less, more,wc, join, sort, split 等等,都是些文本处理命令。
文本处理命令
wc:查看文件统计信息
语法:wc filename
输出:X Y Z filename :行数 单词书 字节数 文件名
选项:
- -l:只统计文件行数
- -w:只统计单词数
- -c:只统计字节数
- -L:统计文件中最长行的长度
sort:文本排序
默认情况下按照字母顺序排序
语法:sort filename
选项:
- -u:去重
- -n:按数值大小排序(否则是按字母顺序,100会排在20前面)
- -r:倒序
- -t:指定分割符,例: sort -t ‘,’ -k2,2 filename以逗号分割,按第二列排序
tr:替换或删除字符
语法:tr 原字符 [新字符]
选项:
- -d:删除
- -cd:保留
- -s:压缩,连续重现出现的字符压缩为一个
例:echo LinuxShell | tr a-z A-Z 将输出LINUXSHELL,把所有小写转化为大写