​ 在我们操作指令的过程中,终端上会有对应的回显,正确时有正确的显示,错误时有错误的显示。而现在我们可以将其进行重定向,让回显进入文件中去

I/O重定向 redirect

I/O重定向:将默认的输入,输出或错误的对应的设备改变,指向新的目标

标准输入输出

Linux给设备提供了三种I/O设备

标准输入(STDIN) -0 默认是接受来自终端窗口的输入

标准输出(STDOUT) -1 默认输出到终端窗口(例如返回结果)

标准错误(STDERR) -2 默认输出到终端窗口(例如报错)

1
2
3
4
输入不用更多的使用,因为我们在终端输入指令是就是标准输入
# 但可以使用另一种方式给指令提供参数( 指令 < 文件 ),即把文件中的内容作为参数提供给指令

# 如果你把0给删了,那终端只是接受不到参数,指令还是接收的到的

标准输出和标准错误重新定向

1和2可以被我们重定向到指定文件,不显示到终端上来

覆盖

1
2
3
4
5
6
# 命令 操作符号 文件名
操作符号
# 1> 或 > 将标准输出重定向到文件
# 2> 把标准错误重定向到文件
# &> 把标准输出和错误都重定向
# >& 功能同上,但建议第一种,更好观看

注:可以进行设置让Linux不准进行覆盖

1
2
3
4
# 这里的设置,-C相当于勾选,+C相当于取消

set -C 禁止将内容覆盖已有文件,但可追加, 但利用 >| 仍可强制覆盖
set  +C 允许覆盖(默认)

追加

1
2
3
>>		追加 标准输出 重定向至文件
2>> 追加 标准错误 重定向至文件
&>> 追加 标准输出 和 标准错误 重定向至文件

可以将正确的输出和错误的输出各指定为不同的文件

1
# 命令 > 文件1 2> 文件2

也可以合并进行重定向

1
2
3
4
5
6
7
8
其中,对/data的查看为标准输出,对/xxx的查看为标准错误
#ls /data /xxx > /data/all.log 2>&1
#ls /data /xxx 2> /data/all.log 1>&2
#ls /data /xxx &> /data/all.log
#ls /data /xxx >& /data/all.log

注:这种写法是错误的!!!!
#ls /data /xxx 2>&1 > /data/all.log

错误原因:命令执行时从前到后,当看到标准错误标准输出重定向到一个文件时,标准输出还没有重定向的具体路径,此时会出现错误,于是标准错误直接输出到终端,而标准输出则根据后面又有的路径输入到all.log文件中(一定要注意顺序问题)

还有另一种用法,但可能会混乱,但一定要区分

1
2
3
4
5
6
7
8
9
10
11
( cat /etc/centos-release /etc/xxx 3>&1 1>&2 2>&3 ) > f1.txt 2> f2.txt

# 注意,前面的1,2,3与I/O设备无关!相当于定义了1,2,3三个文件
()括号内发生的:
# 3>&1:创建文件描述符3,它是文件描述符1(当前标准输出,即f1.txt)的副本

# 1>&2:将文件描述符1(标准输出)重定向到文件描述符2(当前标准错误,即f2.txt)

# 2>&3:将文件描述符2(标准错误)重定向到文件描述符3(最初指向f1.txt)

于是标准输出和标准错误的信息就被置换过来了

标准输入重处理

命令 tr

​ 命令tr:转换或删除字符

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#	tr [选项]  < <输入>
选项
-d 删除所有属于第一字符集的字符
-s 把连续重复的字符以单独一个字符表示,即去重
-t 将第一个字符集对应字符转化为第二字符集对应的字符
-c 取字符集的补集(反选)

官方编写好的字符集匹配(是正则,不是通配,并不兼容通配)
[:alnum:] 字母和数字
[:alpha:] 字母
[:digit:] 数字
[:lower:] 小写字母
[:upper:] 大写字母
[:space:] 空白字符
[:print:] 可打印字符
[:punct:] 标点符号
[:graph:] 图形字符
[:cntrl:] 控制(非打印)字符
[:xdight:] 十六进制字符

示例

1
2
3
4
5
6
# 将/etc/issue中的小写字符都转化成大写字符
tr 'a-z' 'A-Z' < /etc/issue
并不会改变文件内容,相当于先把文件内容倒出来再进行筛选

# 删除fstab文键中的所有abc中任意字符
tr -d abc < /etc/fstab

标准输入重定向

​ 符号 < 允许我们改变命令默认的输入来源(从键盘输入改为从文件或其它来源输入)

1
# <命令> < <作为输入的文件路径>

常见用法:

1.基本文件输入

1
2
wc -l < data.txt
# 这个命令会统计 data.txt 的行数,但与 wc -l data.txt 不同,它不会在输出中显示文件名

2.与需要交互式输入的命令配合

1
2
ftp -n < ftp_commands.txt
# 这里 ftp_commands.txt 里是要自动执行的FTP命令序列,就可以只使用一段代码完成FTP的登陆和操作

3.多行输入

1
2
3
4
5
6
7
8
cat <<EOF
xxx
xxx
xxx
EOF
# 这种形式称为多行输入,后面的 EOF 代表终止符。即输入直到遇到EOF才会终止。也可以改为自己喜欢的其他字母
cat >> filename <<EOF
# 将多行输入直接写入文件filename中

4.多行输入变体

1
2
cat <<< "这是一行文本"
# 直接将后面的字符串作为输入

管道

​ 将”使命”传递下去

​ 管道符 | 用来连接多个命令

1
2
格式
命令1 | 命令2 | 命令3 | ....

用途:

  • 将命令1的输出作为命令2的输入,命令2的输出作为命令3的输入
  • 所有命令会在当前shell进程的子shell进程中执行(即并不是当前终端执行)
  • 组合多个命令的功能实现精准确定自己需要的内容
1
2
3
# 注:标准错误并不会通过管道转发,需要设置
命令1 2>&1 | 命令2
命令1 |& 命令2

管道符就像一个拼接器,想缝出什么样的功能就要看你能想出什么样的射击了

tee命令–分流

​ 将输出进行分流,开枝散叶!

​ 命令tee:重定向到多个目标,经常配合管道符一起使用

1
2
3
命令1 | tee [选项] 文件名 | 命令2
选项
-a 追加到,如果不带这个参数默认是进行覆盖

功能:

  • 保存不同阶段的输出
  • 复杂管道的故障排除
  • 同时查看(输出回显到终端)和记录输出
1
2
3
4
5
6
7
8
9
10
11
12
hostname|tee a.txt > /dev/null
# 将主机名使用tee命令覆盖写入a.txt。同时把对终端的输出扔入黑洞设备
# /dev/null 是黑洞设备,会将一切指向它的内容销毁。不能删文件!!!

tee a.txt > /dev/null
# 使用tee对文件进行多行输入。结束输入是 ctrl + D
# 此处的黑洞设备作用是不让tee进行回显。

# 也可以使用ctrl + C 结束输入。但当tee使用 -i 参数时,ctrl + C 就无法结束输入了,只能使用ctrl + D

ls "*" 2>&1 | tee a
# tee命令默认会丢弃错误信息,但可以通过重定向来解决这个问题