重定向
重定向分为标准输入重定向与标准输出重定向,输入重定向是指把文件导入到命令中,而输出重定向则是指把原本要输出到屏幕的数据信息写入到指定文件中。
分别用几个命令进行测试输入重定向 (test.txt 文本一开始不存在,先演示错误输出重定向,后面创建这个文件,用于演示标准输出重定向):
错误重定向:
## 当 test.txt 文件不存在,直接执行指令会在屏幕上显示报错信息
[root@localhost ~]# cat test.txt
cat: test.txt: No such file or directory
## 此时使用错误重定向将输出的错误信息输入到文件 log.txt 中
## 由于是报错信息所以使用的是 2> 而不是 > ,使用后者是无法将错误信息重定向输入到文件中
[root@localhost ~]# cat test.txt 2> log.txt
## 此时查看文件 log.txt 可以看到错误信息
[root@localhost ~]# cat log.txt
cat: test.txt: No such file or directory
## 上面的重定向写入方式是覆盖写入,即后面写入的内容会将原有的文件的内容覆盖
## 使用 2>> 可将信息追加写入
## 连续执行多次会报错的操作,多次使用 >> 多次写入错误信息
[root@localhost ~]# cat test.txt 2>> log.txt
[root@localhost ~]# cat test.txt 2>> log.txt
[root@localhost ~]# cat test.txt 2>> log.txt
## 可以看到错误信息已经被追加到了 log.txt 文本的后面
[root@localhost ~]# cat log.txt
cat: test.txt: No such file or directory
cat: test.txt: No such file or directory
cat: test.txt: No such file or directory
cat: test.txt: No such file or directory
标准输出重定向:
## 现在,创建文本 test.txt 并写入文字 "this is a text file used to test"
## 可以使用 > 符号将原本输出到屏幕的信息输出到文件中
[root@localhost ~]# echo "this is a text file used to text" > test.txt
## 查看文件内容,可以看到,文本文件中已经被写入了内容
[root@localhost ~]# cat test.txt
this is a text file used to text
## 上一步创建文件的步骤已经使用了 > 作为标准输入重定向的功能,不再赘述
## 同理,如同错误输出重定向,标准输出重定向同样也有覆盖写入操作和追加写入操作
## 读取 test.txt 文本的内容,重定向到 log.txt 文件的末行
[root@localhost ~]# cat test.txt >> log.txt
## 可以看到,log.txt 文本文件已经被追加了一行内容
[root@localhost ~]# cat log.txt
cat: test.txt: No such file or directory
cat: test.txt: No such file or directory
cat: test.txt: No such file or directory
cat: test.txt: No such file or directory
this is a text file used to text
标准输出与错误输出重定向混合使用:
在实际使用中,对于输出的信息不确定是正确信息还是报错信息, 所以需要将标准输出重定向和错误输出重定向结合起来使用
详细信息见下表:
命令行格式 | 示例 | 作用 |
命令 > 文件 | cat test.txt > log.txt (the test.txt file exist) | 将标准输出重定向到 log.txt 文件中(清空原有文件的数据) |
命令 2> 文件 | cat test.txt > log.txt (the test.txt file not exist) | 将错误输出重定向到 log.txt 文件中(清空原有文件的数据) |
命令 >> 文件 | cat test.txt >> log.txt (the test.txt file exist) | 将标准输出重定向到 log.txt 文件中(追加到原有内容的后面) |
命令 2>> 文件 | cat test.txt 2>> log.txt (the test.txt file not exist) | 将错误输出重定向到 log.txt 文件中(追加到原有内容的后面) |
命令 >> 文件 2>&1 或 命令 &>> 文件 | cat test.txt >> log.txt 2>&1 或 cat test.txt &>> log.txt | 将标准输出与错误输出共同写入到文件中(追加到原有内容的后面) 强烈建议写第二种,第一种有点反人类,不好记 |
管道符
管道符的作用,一句话概括就是,把前一个命令原本要输出到屏幕的数据当做是后一个指令的标准输入。
这里演示一个指令,结合 wc 指令、grep 指令 和 管道符 | ,完成查询当前文件夹下的子文件夹个数
## ls -al 指令列举当前文件下的所有文件的详细信息
## 使用管道符 | 将 ls -al 的信息作为指令 grep 的输入流
## grep使用正则表达式过滤d开头的文件,即文件夹类型
[root@localhost ~]# ls -al | grep ^d
dr-xr-x---. 15 root root 4096 Jul 29 19:01 .
drwxr-xr-x. 17 root root 4096 Jul 29 18:31 ..
drwx------. 10 root root 4096 Jul 18 09:59 .cache
drwx------. 15 root root 4096 Jul 6 10:12 .config
drwx------. 3 root root 24 Jul 3 16:38 .dbus
drwxr-xr-x. 2 root root 6 Jul 9 16:36 Desktop
drwxr-xr-x. 2 root root 6 Jul 3 17:29 Documents
drwxr-xr-x. 2 root root 4096 Jul 27 19:33 Downloads
drwx------. 3 root root 18 Jul 3 17:29 .local
drwxr-xr-x. 2 root root 6 Jul 3 17:29 Music
drwxr-xr-x. 5 lujx lujx 4096 Jul 13 20:27 ncdu-1.15.1
drwxr-xr-x. 2 root root 6 Jul 3 17:29 Pictures
drwxr-xr-x. 2 root root 6 Jul 3 17:29 Public
drwxr-xr-x. 2 root root 6 Jul 3 17:29 Templates
drwxr-xr-x. 2 root root 6 Jul 3 17:29 Videos
## 将 ls -al | grep ^d 指令的结果作为指令 wc 的输入流,按行计算,输出文件夹的个数
[root@localhost ~]# ls -al | grep ^d | wc -l
15