在我们操作指令的过程中,终端上会有对应的回显,正确时有正确的显示,错误时有错误的显示。而现在我们可以将其进行重定向,让回显进入文件中去
I/O重定向 redirect
I/O重定向:将默认的输入,输出或错误的对应的设备改变,指向新的目标
标准输入输出
Linux给设备提供了三种I/O设备
标准输入(STDIN) -0 默认是接受来自终端窗口的输入
标准输出(STDOUT) -1 默认输出到终端窗口(例如返回结果)
标准错误(STDERR) -2 默认输出到终端窗口(例如报错)
输入不用更多的使用,因为我们在终端输入指令是就是标准输入
# 但可以使用另一种方式给指令提供参数( 指令 < 文件 ),即把文件中的内容作为参数提供给指令
# 如果你把0给删了,那终端只是接受不到参数,指令还是接收的到的
标准输出和标准错误重新定向
1和2可以被我们重定向到指定文件,不显示到终端上来
覆盖
# 命令 操作符号 文件名
操作符号
# 1> 或 > 将标准输出重定向到文件
# 2> 把标准错误重定向到文件
# &> 把标准输出和错误都重定向
# >& 功能同上,但建议第一种,更好观看
注:可以进行设置让Linux不准进行覆盖
# 这里的设置,-C相当于勾选,+C相当于取消
set -C 禁止将内容覆盖已有文件,但可追加, 但利用 >| 仍可强制覆盖
set +C 允许覆盖(默认)
追加
>> 追加 标准输出 重定向至文件
2>> 追加 标准错误 重定向至文件
&>> 追加 标准输出 和 标准错误 重定向至文件
可以将正确的输出和错误的输出各指定为不同的文件
# 命令 > 文件1 2> 文件2
也可以合并进行重定向
其中,对/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文件中(一定要注意顺序问题)
还有另一种用法,但可能会混乱,但一定要区分
( 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:转换或删除字符
# tr [选项] < <输入>
选项
-d 删除所有属于第一字符集的字符
-s 把连续重复的字符以单独一个字符表示,即去重
-t 将第一个字符集对应字符转化为第二字符集对应的字符
-c 取字符集的补集(反选)
官方编写好的字符集匹配(是正则,不是通配,并不兼容通配)
[:alnum:] 字母和数字
[:alpha:] 字母
[:digit:] 数字
[:lower:] 小写字母
[:upper:] 大写字母
[:space:] 空白字符
[:print:] 可打印字符
[:punct:] 标点符号
[:graph:] 图形字符
[:cntrl:] 控制(非打印)字符
[:xdight:] 十六进制字符
示例
# 将/etc/issue中的小写字符都转化成大写字符
tr 'a-z' 'A-Z' < /etc/issue
并不会改变文件内容,相当于先把文件内容倒出来再进行筛选
# 删除fstab文键中的所有abc中任意字符
tr -d abc < /etc/fstab
标准输入重定向
符号 < 允许我们改变命令默认的输入来源(从键盘输入改为从文件或其它来源输入)
# <命令> < <作为输入的文件路径>
常见用法:
1.基本文件输入
wc -l < data.txt
# 这个命令会统计 data.txt 的行数,但与 wc -l data.txt 不同,它不会在输出中显示文件名
2.与需要交互式输入的命令配合
ftp -n < ftp_commands.txt
# 这里 ftp_commands.txt 里是要自动执行的FTP命令序列,就可以只使用一段代码完成FTP的登陆和操作
3.多行输入
cat <<EOF
xxx
xxx
xxx
EOF
# 这种形式称为多行输入,后面的 EOF 代表终止符。即输入直到遇到EOF才会终止。也可以改为自己喜欢的其他字母
cat >> filename <<EOF
# 将多行输入直接写入文件filename中
4.多行输入变体
cat <<< "这是一行文本"
# 直接将后面的字符串作为输入
管道
将"使命"传递下去
管道符 | 用来连接多个命令
格式
命令1 | 命令2 | 命令3 | ....
用途:
- 将命令1的输出作为命令2的输入,命令2的输出作为命令3的输入
- 所有命令会在当前shell进程的子shell进程中执行(即并不是当前终端执行)
- 组合多个命令的功能实现精准确定自己需要的内容
# 注:标准错误并不会通过管道转发,需要设置
命令1 2>&1 | 命令2
命令1 |& 命令2
管道符就像一个拼接器,想缝出什么样的功能就要看你能想出什么样的射击了
tee命令–分流
将输出进行分流,开枝散叶!
命令tee:重定向到多个目标,经常配合管道符一起使用
命令1 | tee [选项] 文件名 | 命令2
选项
-a 追加到,如果不带这个参数默认是进行覆盖
功能:
- 保存不同阶段的输出
- 复杂管道的故障排除
- 同时查看(输出回显到终端)和记录输出
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命令默认会丢弃错误信息,但可以通过重定向来解决这个问题