Linux 介绍_5 IO重定向

I/O 重定向

我的博客
将以如下几个部分进行讨论:

  • 标准输入、标准输出、标准错误
  • 重定向操作符
  • 如何将一个命令的输出作为另一个命令的输入
  • 如何将命令的输出输出到文件
  • 如何将命令的输出作为扩展添加到文件中
  • 输入重定向
  • 处理标准错误信息
  • 组合输入、输出、错误流重定向
  • 输出过滤

简单的重定向

什么是标准输入与标准输出

大部分 Linux 命令都会读取输入,并做出输出,比如从文件或其他部分读取输入,将输出打印到屏幕上。默认情况下,输入是由键盘给入,输出是由屏幕给出。你的键盘作为你的标准输入(stdin)设备,你的屏幕或指定的终端窗口作为标准输出(stdout)设备。

因为 Linux 是一个灵活的系统,默认的设置并不一定需要满足上面说的那样。

重定向操作符

使用 > 以及 | 做输出重定向

有时候你想要将一个命令的输出放置到一个文件中,或者使用一个命令的输出作为另一个命令的输入。这被称为重定向。重定向可以通过使用符号 >| 符号来实现,发送一个命令的输出到文件或作为另一个命令的输入。

我们之前提到过,cat 命令会将文件中的内容一股脑输出到标准输出中。通过重定向到一个文件,将会把这个文件中的所有内容输出到新文件中,如果新文件不存在则创建它,如果存在,将会覆写文件内容:

$ cat file1
hello world
$ cat file2
goodbye world
$ cat file1 file2 > file3
$ cat file3
hello world
goodbye world

重定向空内容到文件,等同于将文件清空,这个过程称为截断:

$ cat file2
goodbye world
$ >file2
$ cat file2
$

一些例子会用到管道 |,比如在某个文本中匹配某种模式,而排除另一种模式:

grep pattern1 file | grep -v pattern2

每次以一页形式打印目录输出:

ls -la | less

在一个目录中查找一个文件:

ls -l | grep part_of_file_name

输入重定向

有时候,你想要使用一个文件的内容作为命令的输入,但是这个命令不能以文件作为一个选项。使用 < 操作符来实现输入重定向。

下面的例子,以 file1 中的内容作为 grep 命令的输入,查找带有 hello 的行:

$ cat file1
hello world
2233
$ grep "hello" < file1
hello world

重定向组合

下面的例子组合输入与输出重定向,首先对 file1 进行拼写检查,输出重定向到一个日志文件中:

$ cat file1
abondon help me shat fake real reality
file sale englis dell dile
$ spell < file1 > error.log
$ cat error.log
abondon
englis
dile

下面的例子,将 less 的帮助信息,提取关键字 examine 之后,保存到 examine-files-in-less 文件中:

$ less --help | grep -i examin > examin-files-in-less
$ cat examin-files-in-less
  :e [file]            Examine a new file.
  :n                *  Examine the (N-th) next file from the command line.
  :p                *  Examine the (N-th) previous file from the command line.
  :x                *  Examine the first (or N-th) file from the command line.
  +cmd                 Execute the less cmd each time a new file is examined.

>> 操作符

如果不想覆写一个文件,可以通过 >> 操作符,对文件进行内容追加:

$ cat wishlist
more equalization
less poverty
$ date >> wishlist
$ cat wishlist
more equalization
less poverty
2022年 01月 03日 星期一 18:58:52 CST

高级重定向特性

使用描述符

有三种类型的 I/O,他们都具有独自的描述符,称为文件描述符:

  • 标准输入 0
  • 标准输出 1
  • 标准错误 2

在下面的描述中,如果省略掉文件描述符数字,且第一个重定向操作符为 <,那么重定向为的是标准输入。如果第一个重定向描述符为 >,那么重定向的是标准输出。

下面举一些例子:

ls >dirlist 2>&1

将会重定向标准输出以及标准错误到文件 dirlist

ls 2>&1>dirlist

将只会将标准输出内容重定向到 dirlist 中。

不要被 & 迷惑了,在前面我们介绍过 & 用来指示命令在后台运行。在这里, & 只是用来指示后面跟着的数字不是一个文件名,而是数据流指向的方向。另一点需要注意的是 > 符号与文件描述符之间不要用空格隔开。

例子

分析错误

如果你的进程生成了很多错误,下面是逐个查看分析的一种方式:

command 2>&1 | less

这常用在使用 make 创建新文件时使用,比如:

$ make all 2>&1 | less

从标准错误中分离标准输出

下面的例子常被程序员使用,这样,输出展示在一个终端窗口下,错误展示在另一个窗口中:

$ make all 2> /dev/pts/7

同时进行标准输出以及重定向

通过使用 tee 命令,复制输入到标准输出以及一个或多个输出文件中。使用 tee-a 选项会后向追加文件内容。如果你希望同时看到标准输出并保存输出内容,这个命令十分重要。> 以及 >> 符号不允许同时支持这两种操作。

这个工具通常在管道 | 之后调用,如下例:

$ date | tee arvin_test_file
2022年 01月 03日 星期一 19:31:57 CST
arv@arv-OptiPlex-7090:~$ cat arvin_test_file
2022年 01月 03日 星期一 19:31:57 CST

过滤

当程序对输入内容进行操作,并将操作结果打印到标准输出的过程,称为过滤。过滤器最常用在重新组织输出。

grep

详见

过滤输出

使用 sort 命令进行字母排序:

$ cat people-I-like | sort
Arvin Du
Che Guevara
Friedrich Engels
Karl Marx

sort 还可以有更多的操作选项,比如,查看文件的大小。使用这个命令,较小的目录排在前面,较大的文件排在后面:

ls -la | grep -nk 5
posted @ 2022-01-03 19:43  ArvinDu  阅读(77)  评论(0编辑  收藏  举报