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

results matching ""

    No results matching ""