1.重定向概述
1.什么是重定向
将原本要输出到终端的数据信息,重新定向到某个指定的文件中。
2.为什么要使用重定向
1.当终端输出的信息很重要,并且希望保存这些重要的信息时,需要使用重定向.
2.在后台执行中的程序,不希望干扰屏终端正常的输出结果时需要使用.
3.系统的例行命令, 例如定时任务的执行结果,希望可以存下来.
4.一些执行命令,我们已经知道执行后可能出现错误信息, 想直接丢弃.
5.错误日志与正确日志需要分别输出至不同的文件保存时;
< 输入重定向
; cmd1 ; cmd2 无论前者命令成功还是失败,都执行后者命令
&& cmd1 && cmd2 前者命令执行成功,后者命令才会执行
|| cmd1 || cmd2 前者命令执行失败,后者命令才会执行
& 将程序放入后台执行 ( screen 将程序放入后台 )
3.学习重定向的预备知识,标准输入与输出,错误输出
当运行一个程序时通常会自动打开三个标准文件,分别是标准输入、标准输出、错误输出
名称 | 文件描述 | 作用 |
---|---|---|
标准输入 | 0 | 默认是键盘,也可以是命令和文件的输出结果 |
标准输出 | 1 | 默认的输出是终端 |
错误输出 | 2 | 默认的输出是终端 |
进程将从标准输入中得到数据,将正常输出打印至屏幕终端,将错误的输出信息也打印至屏幕终端。
PS: 进程是使用文件描述符file descriptors来管理打开的文件
示例:
使用cat命令查看文件会将文件输出到终端上显示出来

若在使用cat命令时,后面没有跟上所要查看的文件时

回车以后无论输入什么内容都将在回车以后立即返回给终端输出
标准输出重定向
类型 | 操作符 | 作用 |
---|---|---|
正确输出覆盖重定向 | > | 将进程运行后输出的正确内容保存至某个文件中,并且覆盖原有文件中的内容 |
正确输出追加重定向 | >> | 将进程运行后输出的正确内容追加到某个文件中,不会对文件中原有内容进行覆盖 |
错误输出覆盖重定向 | 2> | 将进程运行后错误的输出结果保存至文件中,并且覆盖原有文件中的内容 |
错误输出追加重定向 | 2>> | 将进程运行后输出结果追加到文件中并且不会对原文件内容进行覆盖 |
示例1:标准正确输出重定向
使用普通用户利用find 查找/etc/中的文件将正确输出输出到终端,错误的输出写入1.txt文件中,并且覆盖原文件中的内容

演示效果:

示例2:标准输出追加重定向
使用普通用户利用find来对/etc/下的文件进行查找将正确结果追加并保存到1.txt,错误结果显示

效果演示:


案例3: 错误输出覆盖重定向
将find执行后正确的操作输出,错误结果保存至1.txt,并覆盖原来文件内容

效果演示:


案例4: 正确和错误都输入到相同位置



案例5: 重定向到空设备/dev/null
使用find命令将错误输出输入到/dev/null

效果演示:


案例6: 脚本中使用重定向 (了解即可)
[root@oldboy--day01 ~]# vim ping.sh
ping -c1 10.0.0.1
if [ $? -eq 0 ];then
echo "10.0.0.1 is up."
else
echo "10.0.0.1 is down."
fi
[root@oldboy--day01 ~]# chmod +x ping.sh
[root@oldboy--day01 ~]# ./ping.sh
**改进后版**
[root@oldboy--day01 ~]# vim ping.sh
ping -c1 10.0.0.1 &>/dev/null
if [ $? -eq 0 ];then
echo "10.0.0.1 is up."
else
echo "10.0.0.1 is down."
fi
案例7: 脚本中使用重定向 (了解项)
[root@oldboy--day01 ~]# vim ping2.sh
ping -c1 10.0.0.1 &>/dev/null
if [ $? -eq 0 ];then
echo "10.0.0.1 is up." >>up.txt
else
echo "10.0.0.1 is down." >>down.txt
fi
[root@oldboy--day01 ~]# chmod +x ping2.sh
[root@oldboy--day01 ~]# ./ping2.sh
输入重定向
输入重定向,即原本从键盘等上获得的输入信息,重定向由命令的输出作为输入。< 等价 0<
案例1: 从文件中读入输入的操作
向Tomcat发送一份邮件,内容随意

切换用户进行查看

案例2: 使用grep过滤某个关键字
不写过滤文件名时

使用标准输入添加文件名后

图中可以看出使用重定向的方式和普通追加文件名的方式并没有什么区别.
案例3: 无法形容案例,请看实际操作
[root@oldboy--day01 ~]# dd if=/dev/zero of=/file1.txt bs=1M count=20
[root@oldboy--day01 ~]# dd </dev/zero >/file2.txt bs=1M count=20
案例4: 利用重定向建立多行数据的文件
[root@oldboy--day01~]# echo "111" > file1.txt
[root@oldboy--day01~]# cat file1.txt
111
[root@oldboy--day01 ~]# cat >file2.txt
111
222
333
^D
[root@oldboy--day01 ~]# cat >>file3.txt
aaa
bbb
ccc
^D
案例5: 脚本中打印菜单的一种使用方法。
[root@oldboy--day01~]# vim vm.sh
cat <<-EOF
+------------------- --- ---- --- ---- --- --- ---- --- --+ ||
| ====================== |
| 虚拟机基本管理 v5.0 |
| by xuliangwei |
| ====================== |
| 1\. 安装 KVM |
| 2\. 安装或重置 CentOS-6.9 |
| 3\. 安装或重置 CentOS-7.4 |
| 5\. 安装或重置 Windows-7 |
| 6\. 删除所有虚拟机 |
| q. 退出管理程序 |
+------------------- --- ---- --- ---- --- --- ---- --- --+
EOF
案例6: 两条命令同时重定向
[root@oldboy--day01 ~]# ls; date &>/dev/null
[root@oldboy--day01~]# ls &>/dev/null; date &>/dev/null
[root@oldboy--day01 ~]# (ls; date) &>/dev/null
#后台执行
[root@oldboy--day01 ~]# (while :; do date; sleep 2; done) &
[1] 6378
[root@oldboy--day01 ~]# (while :; do date; sleep 2; done) &>date.txt &
[root@oldboy--day01 ~]# jobs
[1]+ 运行中 ( while :; do date; sleep 2;
done ) &>/date.txt &
4.进程管道技术
1.什么是管道
管道操作符号 "|" ,主要用来连接左右两个命令, 将左侧的命令的标准输出, 交给右侧命令的标准输入
PS: 无法传递标准错误输出至后者命令
2.管道流程示意图

格式: cmd1 | cmd2 [...|cmdn]
3.管道使用案例
案例1: 将/etc/passwd 中的用户按 UID 大小排序

案例2: 统计当前/etc/passwd 中用户使用的 shell 类型

案例5: 打印当前所有 IP

案例6: 打印根分区已用空间的百分比(仅打印数字)

PS: 管道命令符能让我们进一步掌握命令之间的搭配使用方法,进一步提高命令输出值的处理效率。
4.管道中的tee技术
在不影响命令执行操作的同时,将内容不存一份到文件

选项: -a追加

重定向与 tee 有他们在使用过程中的区别

由上图可知直接将内容写入date.txt文件中

由上图可知在命令执行后会输出至屏幕,但会同时保存一份至date.txt文件中
5.xargs参数传递,主要让一些不支持管道的命令可以使用管道技术

在使用一些命令的同时使用ls命令时通过普通的管道的方式无法实现,加上xargs参数后可以完成

在使用ls命令时也不支持管道技术,需加上xargs后将ls的输出临时作为参数传递给管道右面的输入.
< 输入重定向
; cmd1 ; cmd2 无论前者命令成功还是失败,都执行后者命令
&& cmd1 && cmd2 前者命令执行成功,后者命令才会执行
|| cmd1 || cmd2 前者命令执行失败,后者命令才会执行
& 将程序放入后台执行 ( screen 将程序放入后台 )