The Linux Command Line——7. 重定向

 

 

 

 I/O 重定向允许我们来重定义标准输出的地点。我们使用 “>” 重定向符后接文件名将标准输出重定向到除屏幕以外的另一个文件。为什么我们要这样做呢?因为有时候把一个命令的运行结果存储到一个文件很有用处。例如,我们可以告诉 shell 把 ls 命令的运行结果输送到文件ls-output.txt 中去,由文件代替屏幕。

 

 

 注意:我们只是重定向了标准输出,而没有重定向标准错误,所以错误信息会被送到屏幕。

当我们使用 “>” 重定向符来重定向输出结果时,目标文件总是从开头被重写。

如果我们需要清空一个文件内容(或者创建一个新的空文件),可以使用这样的技巧:

 

 

 怎样才能把重定向结果追加到文件内容后面,而不是从开头重写文件?为了这个目的,我们使用 “>>” 重定向符,像这样:

 

 

 我们已经将这些文件流的前三个称作标准输入、输出和错误,shell 内部分别将其称为文件描述符 0、1 和 2。shell 使用文件描述符提供了一种表示法来重定向文件。因为标准错误和文件描述符 2 一样,我们用这种表示法来重定向标准错误:

 

 

 文件描述符 “2”,紧挨着放在重定向操作符之前,来执行重定向标准错误到文件 ls-error.txt任务。

重定向标准输出和错误到同一个文件

 

 

 使用这种方法,我们完成两个重定向。首先重定向标准输出到文件 ls-output.txt,然后重定向文件描述符 2(标准错误)到文件描述符 1(标准输出)使用表示法 2>&1。

 

 

 在这个例子里面,我们使用单单一个表示法 &> 来重定向标准输出和错误到文件ls-output.txt。

有时候“沉默是金”,我们不想要一个命令的输出结果,只想把它们扔掉。这种情况尤其适用于错误和状态信息。系统通过重定向输出结果到一个叫做 “/dev/null” 的特殊文件,为我们提供了解决问题的方法。

 

 cat 命令读取一个或多个文件,然后复制它们到标准输出,就像这样:

 

 cat可以用来把文件连接在一起

 

 创建一个叫做 “lazy_dog.txt” 的文件,这个文件包含例子中的文本。

 

 输入命令,其后输入要放入文件中的文本。记住,最后输入 Ctrl-d

 

使用 cat 来复制文件内容到标准输出:

 

 重定向标准输入:

 

 使用“<”重定向操作符,我们把标准输入源从键盘改到文件 lazy_dog.tx。我们看到结果和传递单个文件名作为参数的执行结果一样。

 

命令从标准输入读取数据并输送到标准输出的能力被一个称为管道线的 shell 特性所利用。使用管道操作符 “|”(竖杠),一个命令的标准输出可以通过管道送至另一个命令的标准输入:

 

 管道线经常用来对数据完成复杂的操作。有可能会把几个命令放在一起组成一个管道线。通常,以这种方式使用的命令被称为过滤器。过滤器接受输入,以某种方式改变它,然后输出它。

我们想把目录/bin 和/usr/bin 中的可执行程序都联合在一起,再把它们排序,然后浏览执行结果:

 

 因为我们指定了两个目录(/bin 和/usr/bin),ls 命令的输出结果由有序列表组成,各自针对一个目录。通过在管道线中包含 sort,我们改变输出数据,从而产生一个有序列表

 

uniq 从标准输入或单个文件名参数接受数据有序列表(详情查看 uniq 手册页),默认情况下,从数据列表中删除任何重复行

 

 在这个例子中,我们使用 uniq 从 sort 命令的输出结果中,来删除任何重复行。如果我们想看到重复的数据列表,让 uniq 命令带上 “-d” 选项,就像这样:

 

 

wc(字计数)命令是用来显示文件所包含的行数、字数和字节数

 

 “-l” 选项限制命令输出只能报道行数。查看我们的有序列表中程序个数。

 

 

grep 是个很强大的程序,用来找到文件中的匹配文本

grep 能够匹配的模式可以很复杂,但是现在我们把注意力集中在简单文本匹配上面。

我们想在我们的程序列表中,找到文件名中包含单词 “zip” 的所有文件。这样一个搜索,可能让我们了解系统中的一些程序与文件压缩有关系。

 

grep 有一些方便的选项:“-i” 使得 grep 在执行搜索时忽略大小写(通常,搜索是大小写敏感的),“-v” 选项会告诉 grep 只打印不匹配的行

 

head 命令打印文件的前十行,而 tail 命令打印文件的后十行。默认情况下,两个命令都打印十行文本,但是可以通过 “-n” 选项来调整命令打印的行数

 

 它们也能用在管道线中:

 

 tail 有一个选项允许你实时地浏览文件

 

 使用 “-f” 选项,tail 命令继续监测这个文件,当新的内容添加到文件后,它们会立即出现在屏幕上。这会一直继续下去直到你输入 Ctrl-c

 

当在某个中间处理阶段来捕捉一个管道线的内容时,我们是使用“tee”

在 grep 过滤管道线的内容之前,来捕捉整个目录列表到文件 ls.txt:

posted @ 2021-04-19 17:56  北漂的尘埃  阅读(69)  评论(0编辑  收藏  举报