IO重定向
# 重定向基础概述
# 什么是重定向
将原本要输出到屏幕中的数据信息,重新定向到某个指定的文件中,或者定向到黑洞中。
# 为什么需要重定向
- 当屏幕输出的信息很重要,而且希望保存重要的信息时;
- 后台执行中的程序,不希望他干扰屏幕正常的输出结果时;
- 系统的例行命令,例如定时任务的执行结果,希望可以存下来时;
- 一些执行命令,我们已经知道他可能出现错误信息,想将他直接丢弃时;
- 错误日志与正确日志需要分别输出至不同的文件保存时;
# 标准输入与输出
- 当进程操作一个文件时:
- 首先程序是无法直接访问硬件,需要借助内核来访问文件;
- 而内核
kernel
需要利用文件描述符(file descriptor)
来访问文件。
- 总结:进程使用文件描述符来管理打开的文件对应关系;
- 通常程序访问一个文件至少会打开三个标准文件,分别是标准输入、标准输出、错误输出。
- 进程将从标准输入中得到数据,将正常输出打印至屏幕终端,将错误的输出信息也打印至屏幕终端。
名称 | 文件描述符 | 作用 |
---|---|---|
标准输入(STDIN) | 0 | 默认是键盘,也可以是文件或其他命令的输出。 |
标准输出(STDOUT) | 1 | 默认输出到屏幕。 |
错误输出(STDERR) | 2 | 默认输出到屏幕。 |
文件名称(filename) | 3+ |
# 输出重定向案例
输出重定向,改变输出内容的位置。输出重定向有如下几种方式,如表格所示
类型 操作符 用途 是否覆盖原文件 标准覆盖输出重定向 > 将程序输出的正确结果输出到指定的文件中 覆盖 标准追加输出重定向 >> 将程序输出的正确结果以追加的方式输出到指定文件 不覆盖 错误覆盖输出重定向 2> 将程序的错误结果输出到执行的文件中 覆盖 错误追加输出重定向 2>> 将程序输出的错误结果以追加的方式输出到指定文件 不覆盖
# 案例1-标准输出重定向
标准输出重定向示例
- 如果文件不存在则创建
- 如果文件存在则清空内容
[root@web ~]# > file.txt [root@web ~]# ifconfig eth0 > file.txt
1
2
# 案例2-标准追加输出重定向
标准追加输出重定向示例。
- 如果文件不存在则创建
- 如果文件存在则在文件尾部添加内容
[root@web ~]# echo "Hello students" >> file.txt
1
# 案例3-错误输出重定向
标准错误输出重定向
正确输出及错误输出至相同文件
正确输出及错误输出至不同的文件
[root@web ~]# find /etc -name "*.conf" 1>ok 2>ok [root@web ~]# find /etc -name "*.conf" 1>ok 2>err
1
2
# 案例4-混合和输出重定向
混合输出重定向
- 将正确输出和错误输出混合至同一文件
- 将两个文件内容组合为一个文件
[root@web ~]# find /etc -name "*.conf" &>ab [root@web ~]# cat a b > c
1
2正确和错误都输入到相同位置
[root@web ~]# ls /root /error >ab 2>&1
1
# 案例5-将内容输出至黑洞
将内容输出至黑洞设备
/dev/null
[root@web ~]# ls /root /error >ab 2>/dev/null [root@web ~]# ls /root /error >ab &>/dev/null
1
2
# 进程管道技术
# 什么是管道
- 管道操作符号
|
,主要用来连接左右两个命令,将左侧的命令的标准输出,交给右侧命令的标准输入 - 注意事项:无法传递标准错误输出至后者命令
# 管道流程示意图
- 格式:
cmd1 | cmd2 [...|cmdn]
# 管道使用案例
# 案例1
案例1:将
/etc/passwd
中的用户按UID
大小排序[root@web ~]# sort -t":" -k3 -n /etc/passwd [root@web ~]# sort -t":" -k3 -n /etc/passwd -r [root@web ~]# sort -t":" -k3 -n /etc/passwd |head
1
2
3
# 案例2
案例2:统计当前
/etc/passwd
中用户使用的shell
类型# 思路:取出第七列(shell) | 排序(把相同归类) | 去重 [root@web ~]# awk -F: '{print $7}' /etc/passwd [root@web ~]# awk -F: '{print $7]' /etc/passwd |sort [root@web ~]# awk -F: '{print $7}' /etc/passwd |sort |uniq [root@web ~]# awk -F: '{print $7}' /etc/passwd |sort |uniq -c
1
2
3
4
5
# 案例3
案例3:打印当前所有IP
[root@web ~]# ip addr |grep 'inet ' |awk '{print $2}' |awk -F "/" '{print $1}' 127.0.0.1 192.168.69.112
1
2
3
# tee与xargs
# 管道中使用tee
# 选项:-a追加
[root@web ~]# ip addr |grep 'inet ' |tee ip.txt |awk -F "/" '{print $1}' |awk '{print $2}'
127.0.0.1
10.8.0.100
[root@web ~]# cat ip.txt
inet 127.8.8.1/8 scope host lo
inet 10.0.0.100/24 brd 192.168.69.255 scope global ens32
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
重定向与tee
他们在使用过程中有什么区别
[root@web ~]# date > date.txt #直接将内容写入date.txt文件中
[root@web ~]# date |tee date.txt #命令执行会输出至屏幕,但会同时保存一份至date.txt文件中
1
2
2
# 管道中使用xargs
xargs
参数传递,主要让一些不支持管道的命令可以使用管道技术[root@web ~]# which cat |xargs ls -l [root@web ~]# ls |xargs rm -fv
1
2
Last Updated: 2021/11/12, 16:51:33