7. I/O 重定向
很多命令如 ls
打印其输出到显示器上。我们可以使用特殊符号将输出 重定向 到文件、设备,甚至其他命令的输入中。
标准输出
很多命令和程序将其结果显示到一个称为 标准输出 的设备中。默认情况下,标准输出重定向其内容到显示器上。如要重定向输出到文件,使用 >
符号,示例:
$ ls > file_list.txt
以上示例中,ls
命令的执行结果会写到名为 file_list.txt 的文件中,且显示器上因此无内容显示。
每次重复执行以上命令 file_list.txt 的内容都会被覆盖。如果你想 追加 内容到文件中,使用 >>
符号。示例:
$ ls >> file_list.txt
如果文件不存在则会先创建。
标准输入
默认情况下,标准输入来自于键盘,但是像标准输出一样,也可以重定向。要将标准输入由键盘变为一个文件,你需要使用 <
符号。示例:
$ sort < file_list.txt
我们可以将上面的结果重定向到一个文件中:
$ sort < file_list.txt > sorted_file_list.txt
由上面可见,一个命令可同时拥有输入和输出重定向。>
和 <
符号的顺序没有关系。唯一需要注意的是,重定向符 >
和 <
必须在其他选项和参数的后面。
管道
你可以用 I/O 重定向做的最有用和最强大的事是将其与多个命令通过 管道 组合使用。通过管道符,一个命令的标准输出作为另一个命令的标准输入。示例:
$ ls -l | less
使用 | less
管道,你可以将任意命令的输出可以滚动。示例:
ls -lt | head
:显示当前目录下最新的 10 个文件du | sort -nr
:显示目录已使用空间列表,由大到小排序find . -type f -print | wc -l
:显示当前工作目录及其子目录下的总文件数
过滤器
管道符中常用的一类程序称为 过滤器。以下是一些可以作为过滤器的常见程序:
程序 | 功能 |
---|---|
sort | 对标准输入进行排序,然后将排序结果输出到标准输出 |
uniq | 从标准输入中读取一个排好序的数据流,移除数据中的重复行(也就是,确保输出的每一行都是唯一的) |
grep | 检查从标准输入中读取的数据中的每一行,并输出其中包含指定模式字符的行 |
fmt | 从标准输入中读取文本,并在标准输出中输出格式化后的文本 |
pr | 从标准输入中读取文本,并将数据分割为带页面分隔符、页首、页尾的分页数据以准备打印 |
head | 输出其输入内容的前几行 |
tail | 输出其输入内容的后几行,常用于查看最新的日志 |
tr | 翻译字符。可以用于完成大小写转换或转换行结束标识(例如,转换 DOS 文本文件为 Unix 文件风格) |
sed | 流编辑器。相比 tr 可以完成更复杂的任务。 |
awk | 一个完整的程序语言,为构建过滤器而设计。十分强大。 |
通过管道符完成任务 从命令行打印
$ cat poorly_formatted_report.txt | fmt | pr | lpr
$ cat unsorted_list_with_dupes.txt | sort | uniq | pr | lpr
查看 tar 文件中的内容
$ tar tzvf name_of_file.tar.gz | less