06.Linux IO重定向
目录
08.Linux IO重定向
1. 重定向基础概述
1.1 什么是重定向
将原本要输出到屏幕中的数据信息,重新定向到某个指
定的文件中,或者定向到黑洞(/dev/null)中。
1.2 为什么需要重定向
1、当程序执行输出的信息比较多时,需要保存下来
在进行分页查看;
2、后台执行的程序一般都会有输出,不希望它的输
出干扰到屏幕;
3、定时执行的备份任务,希望将备份的结果保留下
来时;
4、当重复创建用户,会提示一些错误信息,可以直
接将信息丢弃;
5、希望将错误日志与正确日志,分别输出保存到不
同文件时;
1.3 标准输入与输出
-
当进程操作一个文件时:
- 1.首先进程是无法直接访问硬件,需要借助内核来
访问文件; - 2.而内核 kernel 需要利用文件描述符 (file
descriptor) 来访问文件。文件描述符百度百科
- 1.首先进程是无法直接访问硬件,需要借助内核来
-
总结:进程--通过-->文件描述符(非负整数)--访问-->文件名称;进程使用文件描述符来管理打开的文件
对应关系; -
第一步:运行 tail -f /etc/passwd
-
第二步:通过文件描述符3 --> /etc/passwd --> inode
--> block -
第三步:正确输出---> 默认情况下通过文件描述 1 ---
当前终端 1>(改变输出的位置,文件,黑洞) -
第四步:错误输出--> 默认情况下通过文件描述2 --->
当前终端 2> -
通常程序访问一个文件至少会打开三个标准文件,分
别是标准输入、标准输出、错误输出。 -
进程将从标准输入中得到数据,将正常输出打印至屏
幕终端,将错误的输出信息也打印至屏幕终端。
名称 | 文件描述符 | 作用 |
---|---|---|
标准输入(STDIN) | 0 | 默认是键盘,也可以是文件或其他命令的输出 |
标准输出(STDOUT) | 1 | 默认输出到屏幕 |
错误输出(STDERR) | 2 | 默认输出到屏幕 |
文件名称(filename) | 3+ |
2. 输出重定向案例
-
输出重定向.改变输出内容的位置.输出输出重定向有如
下几种方式,如表格所示类型 操作符 用途 标准覆盖输出重定向 1> 将程序输出的正确结果输出到指定的文件中去,会覆盖原文件的内容 标准追加输出重定向 1>> 将程序输出的正确结果以追加的方式输出到指定文件.不会覆盖原有文件 错误覆盖输出重定向 2> 将程序的错误结果输出到执行的文件中.会覆盖文件原有内容 错误追加输出重定向 2>> 将程序输出的错误结果以追加的方式输出到指定文件.不会覆盖原有文件
2.1 案例1-标准输出重定向
- 标准输出重定向示例
- 1.如果文件不存在则创建
- 2.如果文件存在则清空内容
[root@oldxu ~]# > edu.txt
[root@oldxu ~]# ifconfig eth0 > edu.txt
2.2 案例2-标准追加输出重定向
- 标准追加输出重定向示例
- 1.如果文件不存在则创建
- 2.如果文件存在则在文件尾部添加内容
[root@oldxu ~]# echo "Hello Students" >> if
2.3 案例3-错误输出重定向
- 标准错误输出重定向
- 1.正确输出及错误输出至相同文件
- 2.正确输出及错误输出至不同文件
[xuliangwei@oldxu ~]$ find /etc -name
"*.conf" 1>ok 2>ok
[xuliangwei@oldxu ~]$ find /etc -name
"*.conf" 1>ok 2>err
2.4 案例4-混合和输出重定向
- 混合输出重定向
- 1.将正确输出和错误输出混合至同一文件
- 2.将两个文件内容组合为一个文件
[xuliangwei@oldxu ~]$ find /etc -name
"*.conf" &>ab
[xuliangwei@oldxu ~]$ cat a b > c
- 正确和错误都输入到相同位置
[root@oldxu ~]# ls /root /error >ab 2>&1
2.5 案例5-将内容输出至黑洞
-
将内容输出至黑洞设备
/dev/null
[root@oldxu ~]# ls /root /error >ab 2>/dev/null [root@oldxu ~]# ls /root /error >ab &>/dev/null
3. 输入重定向案例
- 输入重定向:指的是"重新指定设备"来"代替键盘"做为新的输入设备;
3.1 输入重定向示例
1.通过输入重定向读取文件内容;
[root@oldxu ~]# cat < /etc/hosts
2.通过输入重定向读入多行内容
[root@dns-master ~]# cat <<EOF
小明 99
小红 100
小王 80
EOF # 只要不出现EOF则可以一直输入
3.通过输入重定向将数据导入至数据库中;
[root@oldxu ~]# mysql -uroot -poldxu.com </opt/wordpress.sql
3.2 脚本输入重定向
- 使用输入重定向打印安装服务的菜单导航栏
[root@dns-master ~]# cat install.sh
#!/usr/bin/bash
cat <<-EOF
---------主菜单----------
| 1) 安装nginx |
| 2) 安装php |
| 3) 退出 |
--------------------------
EOF
read -p "请选择你要安装的软件编号 [ 1 | 2 | 3
]: "
3.3 输入重定向场景
- 1.恢复数据时;
- 2.脚本打印菜单时会用到
- 3.cat写入文件时;vim
- 输出重定向:
- 正确输出:
- 1> : 覆盖(先清空,后写入)
- 1>> : 直接写入文件的尾部(末尾)
- 错误输出 :
- 2> : 覆盖(先清空,后写入)
- 2>> : 直接写入文件尾部(末尾)
- 混合输出
- &> /dev/null
- &>> /dev/null
- 1>/dev/null 2>&1
- 正确输出:
4.进程管道技术
4.1 什么是管道
- 管道操作符" | ",主要用来连接左右两个命令,将左侧的命令[标准输出],交给右侧命令的[标准输入]
- 注意事项:无法传递标准错误输出至后者的命令
- 管道命令符能让大家进一步掌握命令之间的搭配使用方法.进一步提高命令输出值的处理效率
4.2 管道流程示意图
- 格式: cmd1 | cmd2 [... | cmdn ]
4.3 管道使用案例
4.3.1 案例1
- 案例1.将/etc/passwd中的用户按UID大小排序
[root@oldxu ~]# sort -t":" -k3 -n
/etc/passwd
[root@oldxu ~]# sort -t":" -k3 -n
/etc/passwd -r
[root@oldxu ~]# sort -t":" -k3 -n
/etc/passwd |head
4.3.2 案例2
- 案例2 : 统计当前/etc/passwd 中用户使用的shell 类型
# 思路:取出第七列(shell) | 排序(把相同归类)| 去重
[root@oldxu ~]# awk -F: '{print $7}'
/etc/passwd
[root@oldxu ~]# awk -F: '{print $7}'
/etc/passwd |sort
[root@oldxu ~]# awk -F: '{print $7}'
/etc/passwd |sort |uniq
[root@oldxu ~]# awk -F: '{print $7}'
/etc/passwd |sort |uniq -c
4.3.3 案例3
- 案例3:打印并输出当前所有主机所有网卡的 IP 地址
[root@oldxu ~]# ip addr |grep 'inet ' |awk
'{print $2}' |awk -F"/" '{print $1}'
127.0.0.1
10.0.0.100
4.4 tee与xargs
4.4.1 管道中使用tee
#选项: -a追加
[root@web ~]# ip addr |grep 'inet ' |tee
ip.txt |awk -F"/" '{print $1}' |awk '{print
$2}'
127.0.0.1
10.0.0.100
[root@web ~]# cat ip.txt
inet 127.0.0.1/8 scope host lo
inet 10.0.0.100/24 brd 192.168.69.255 scope
global ens32
4.4.2 管道中使用xargs
- xargs 参数传递,主要让一些不支持管道的命令可以
使用管道技术
# which cat | xargs ls -l
# ls | xargs rm -fv
本文来自博客园,作者:GaoBeier,转载请注明原文链接:https://www.cnblogs.com/gao0722/p/15026546.html