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