内容目录
重定向基础概述
什么是重定向
将原本要输出到屏幕中的数据信息,重新定向到某个指定的文件中,或者定向到黑洞中
为什么需要重定向
- 当程序执行输出的信息比较多时,需要保存下来在进行分页查看
- 后台执行的程序一般都会有输出,不希望它的输出干扰到屏幕
- 定时执行的备份任务,希望将备份的结果保留下来时
- 当重复创建用户,会提示一些错误信息,可以直接将信息丢弃
- 希望将错误日志与正确日志,分别输出保存到不同文件时
标准输入与输出
- 当进程操作一个文件时:
- 首先程序是无法直接访问硬件,需要借助内核来访问文件
- 而内核
kernel
需要利用文件描述符(file descriptor)
来访问文件
- 总结:进程--通过-->文件描述符(非负整数)--访问-->文件名称;进程使用文件描述符来管理打开的文件对应关系
- 通常程序访问一个文件至少会打开三个标准文件,分别是标准输入、标准输出、错误输出
- 进程将从标准输入中得到数据,将正常输出打印至屏幕终端,将错误的输出也打印至屏幕终端
名称 | 文件描述符 | 作用 |
---|---|---|
标准输入(stdin) | 0 | 默认是键盘,也可以是文件或其他命令的输出 |
标准输出(stdout) | 1 | 默认输出到屏幕 |
错误输出(stderr) | 2 | 默认输出到屏幕 |
文件名称(filename) | 3+ |
输出重定向案例
- 输出重定向,改变输出内容的位置。输出重定向有如下几种方式
类型 | 操作符 | 用途 |
---|---|---|
标准覆盖输出重定向 | > | 将程序输出的正确结果输出到指定的文件中,会覆盖文件原有的内容 |
标准追加输出重定向 | >> | 将程序输出的正确结果以追加的方式输出到指定文件,不会覆盖原有内容 |
错误覆盖输出重定向 | 2> | 将程序输出的错误结果输出到指定的文件中,会覆盖文件原有的内容 |
错误追加输出重定向 | 2>> | 将程序输出的错误结果以追加的方式输出到指定文件,不会覆盖原有内容 |
案例1-标准输出重定向
- 标准输出重定向示例
- 如果文件不存在则创建
- 如果文件存在则清空内容
> edu.txt
ifconfig eth0 > edu.txt
案例2-标准追加输出重定向
- 标准追加输出重定向示例
- 如果文件不存在则创建
- 如果文件存在则在文件尾巴添加内容
echo "hello students" >> edu.txt
案例3-错误输出重定向
- 标准错误输出重定向
- 正确输出及错误输出至相同文件
- 正确输出及错误输出至不同的文件
find /etc -name "*.conf" 1>ok 2>ok
find /etc -name "*.conf" 1>ok 2>err
案例4-混合输出重定向
- 混合输出重定向
- 将正确输出和错误输出混合至同一文件
- 将两个文件内容组合为一个文件
find /etc -name "*.conf" &>ab
cat a b > c
- 正确和错误输出输入到相同文件
ls /root /error >ab 2>&1
案例5-将内容输出至黑洞
- 将内容输出至黑洞设备
/dev/null
ls /root /error >ab 2> /dev/null
ls /root /error >ab &>/dev/null
输入重定向案例
- 输入重定向:指的是重新指定设备来代替键盘作为新的输入设备
输入重定向示例
- 通过输入重定向读取文件内容
cat /etc/hosts
- 通过输入重定向读入多行内容
cat <<EOF
100
99
98
EOF # 只要不出现EOF则可以一直输入
- 通过输入重定向将数据导入至数据库中
mysql -uroot -pxxx < /opt/wordpress.sql
脚本输入重定向
- 使用脚本输入重定向打印安装服务的菜单导航栏
cat install.sh
#!/usr/bin/bash
cat <<EOF
--------主菜单--------
| 1)安装nginx |
| 2)安装php |
| 3)退出 |
----------------------
EOF
read -p "请选择你要安装的软件编号[ 1 | 2 | 3 ]:"
进程管道技术
什么是管道
- 管道操作符号
|
,主要用来连接左右两个命令,将左侧的命令的标准输出,交给右侧命令的标准输入 - 注意事项:无法传递标准错误输出至后者命令
- 管道命令符能让大家能进一步掌握命令之间的搭配使用方法,进一步提高命令输出值的处理效率
管道流程示意图
- 格式:
cmd1 | cmd2 | [...|cmdn]
管道使用案例
- 案例1:将
/etc/passwd
中的用户按UID
大小排序
sort -t ":" -k3 -n /etc/passwd
sort -t ":" -k3 -n /etc/passwd -r
sort -t ":" -k3 -n /etc/passwd | head
- 案例2:统计当前
/etc/passwd
中用户使用的shell
类型
awk -F: '{print $7}' /etc/passwd
awk -F: '{print $7}' /etc/passwd | sort
awk -F: '{print $7}' /etc/passwd | sort | uniq
awk -F: '{print $7}' /etc/passwd | sort | uniq -c
- 案例3:打印并输出当前所有主机所有网卡的
IPv4
地址
ip addr | grep 'inet ' | awk '{print $2}' | awk -F"/" '{print $1}'
tee与xargs
管道中使用tee
ip addr | grep 'inet ' |tee ip.txt | awk '{print $2}' | awk -F"/" '{print $1}'
127.0.0.1
blue.yn.cn
cat ip.txt
inet 127.0.0.1/8 scope host lo
inet blue.yn.cn/24 brd 192.168.99.255 scope global noprefixroute eth0
管道中使用xargs
xargs
参数传递,主要让一些不支持管道的命令可以使用管道技术which cat | xargs ls -l ls | xargs rm -fv
留言