day14-重定向
1、重定向概念
1、什么是重定向
将原本要输出到屏幕的数据信息,重定向到某个指定的文件中。
2、为何要使用重定向
1、当屏幕输出的信息很重要,而且希望保存重要的信息时;
2、后台执行中的程序,不希望它干扰屏幕正常的输出结果时;
3、系统的例行命令,例如定时任务的执行结果,希望可以不存下来时;
4、一些执行命令,我们已经知道他可能出现错误信息,想将它直接丢弃时;
5、错误日志与正常日志要分别输出至不同的文件保存时;
< 输入重定向
; cmd1 ; cmd2 无论前者命令成功还是失败,都执行后者命令
&& cmd1 && cmd2 前者命令执行成功,后者命令才会执行
|| cmd1 || cmd2 前者命令执行失败,后者命令才会执行
& 将程序放入后台执行 ( screen 将程序放入后台 )
3、学习重定向的预备知识,标准输入与输出
当运行一个程序时通常会自动打开三个标准文件,分别是标准输入、标准输出、错误输出
1565333294026.png
进程将从标准输入中得到数据,将正常输出打印至屏幕终端,将错误的信息也打印至屏幕终端
ps:进程是使用文件描述(file descriptors)来管理打开的文件
以cat命令为例,cat命令的功能是从命令行给出的文件中读取数据,并将这些数据直接送到标准输出。
#会把文件/etc/passwd的内容输出显示到屏幕上
[root@wzz ~]# cat /etc/passwd
如果使用cat命令没有跟上输入的文件名,那么cat命令则会通过命令行标准输入中读取数据,并将其送到标准输出。
[root@wzz ~]# cat
hello
hello
^C
#用户输入的每一行都立刻cat命令输出到屏幕上。
下面了解一下标准输入输出过程
#持续追踪查看文件内容
[root@wzz ~]# tail -f /etc/passwd
#查看运行的进程
[root@wzz ~]# ps
PID TTY TIME CMD
6655 pts/0 00:00:00 bash
6812 pts/0 00:00:00 ps
#查看tail命令的pid,6655进程下的文件描述
[root@wzz ~]# ls -l /proc/6655/fd
total 0
lrwx------. 1 root root 64 Aug 9 12:02 0 -> /dev/pts/0
lrwx------. 1 root root 64 Aug 9 12:02 1 -> /dev/pts/0
lrwx------. 1 root root 64 Aug 9 12:02 2 -> /dev/pts/0
lrwx------. 1 root root 64 Aug 9 15:10 255 -> /dev/pts/0
#Linux查看标准输入输出设备
[root@wzz ~]# ls -l /dev/std*
lrwxrwxrwx. 1 root root 15 Aug 9 12:00 /dev/stderr -> /proc/self/fd/2
lrwxrwxrwx. 1 root root 15 Aug 9 12:00 /dev/stdin -> /proc/self/fd/0
lrwxrwxrwx. 1 root root 15 Aug 9 12:00 /dev/stdout -> /proc/self/fd/1
2、输出重定向
输出重定向,改变输出内容的位置。输出从定向有几种方式,如表格所示
1565334908397.png
案例1:标准输出从定向(每次都会覆盖文件)
#标准输出重定向,先清空,后写入,如果文件不存在则创建
[root@wzz ~]# ifconfig eth0 >abc
[root@wzz ~]# cat abc
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 10.0.0.200 netmask 255.255.255.0 broadcast 10.0.0.255
inet6 fe80::5174:534f:631a:8a37 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:08:f0:17 txqueuelen 1000 (Ethernet)
RX packets 1639 bytes 142658 (139.3 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 1304 bytes 144602 (141.2 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0</pre>
案例2:标准输出重定向(会往文件的尾部添加内容)
#标准追加输出重定向,向配置文件末尾追加内容
[root@wzz ~]# echo "This is network conf" >>abc
[root@wzz ~]# cat abc
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 10.0.0.200 netmask 255.255.255.0 broadcast 10.0.0.255
inet6 fe80::5174:534f:631a:8a37 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:08:f0:17 txqueuelen 1000 (Ethernet)
RX packets 1639 bytes 142658 (139.3 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 1304 bytes 144602 (141.2 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
This is network conf</pre>
案例3:错误输出重定向
#正确输出以及错误输出重定向至一个文件
[root@wzz ~]# ls abc
abc
[root@wzz ~]# lls abc
-bash: lls: command not found
[root@wzz ~]#
#将标准输出和标准错误输出重定向到不通文件
[root@wzz ~]# ls abc,lls abc 1>a 2>
案例4:正确和错误都输入到相同位置
#将标准输出和标准错误输出重定向到同一个文件,混合输出
[root@wzz ~]# ls abc,lls abc >&ab
#合并两个文件内容至一个文件
[root@wzz ~]# cat a b >c</pre>
案例5:正确和错误都输入到相同位置
#重定向到相同的位置
[root@wzz ~]# ls abc,lls abc >ab 2>&1</pre>
案例6:重定向到空设备
#产生的任何数据放入黑洞设备,则视为丢弃。
[root@wzz ~]# ls abc,lls abc >ab 2>/dev/null
[root@wzz ~]# ls abc,lls abc >ab &>/dev/null</pre>
案例7:脚本中使用重定向
[root@wzz ~]# vim ping.sh
ping -c 10.0.0.100 &>/dev/null
if [ $? -eq 0 ];then
echo "10.0.0.100 up."
else
echo "10.0.0.100 down."
fi
案例8:脚本中使用重定向
[root@wzz ~]# vim ping2.sh
ping 10.0.0.100 -c 1 -W 1 &>/dev/null
if [ $? -eq 0 ];then
echo "10.0.0.100 up" >> up.txt
else
echo "10.0.0.100 down" >> down.txt
fi
[root@wzz ~]# chmod +x ping2.sh
[root@wzz ~]# ./ping2.sh</pre>
3、输入重定向
输入重定向,即原本从键盘上获得的输入信息,重定向由命令的输出作为输入。<等价0<
案例1:从文件中读入输出的操作
#没有改变输入的方向,默认键盘
[root@wzz ~]# mail alice
Subject: hello
1111111111
2222222222
3333333333
.
EOT
#检查是否收到邮件
[root@wzz ~]#su - alice
[root@wzz ~]#mail
#输入重定向,来自于文件
[root@wzz ~]#mail -s "test01" alice < /etc/hosts</pre>
案例2:脚本中打印菜单的一种使用方法
[root@wzz ~]#vim vm.sh
cat <<-EOF
+------------------------------------+ ||
| ============================= |
| 虚拟机基本管理 v5.0 |
| by wzz |
| ===================== |
| 1.安装KVM |
| 2.安装或重置 centos-6.9 |
| 3.安装或重置 centos-7.4 |
| 4.删除所有虚拟机 |
| q. 退出管理程序 |
+-------------------------------------+
EOF
subshell
[root@wzz ~]# cd /boot; ls
#如果不希望某些命令的执行对当前 shell 环境生产影响,请在subshell中执行
3、进程管道技术
1.什么是管道
管道操作符号 “|”,主要用来连接左右两个命令,将左边的命令的标准输出,交给右侧命令的标准输入
2.管道格式:cmd1 | cmd2 [..../cmdn]
案例1:将/etc/passwd 中的用户按UID大小写排列
[root@wzz ~]# cat /etc/passwd | awk -F ":" '{print $3}'| sort -rn</pre>
3.管道中的tee技术
选项: -a追加
[root@wzz ~]# ip addr | grep 'inet ' | tee ip.txt | awk -F "/" '{print $1}' | awk '{print $2}'
127.0.0.1
10.0.0.200
[root@wzz ~]# cat ip.txt
inet 127.0.0.1/8 scope host lo
inet 10.0.0.200/24 brd 10.0.0.255 scope global noprefixroute eth0</pre>
4、xargs参数传递
# which cat | xargs ls -l
#ls | xargs rm -fv
#ls | xargs cp -rvt /tmp
#ls | xargs -I {} /tmp</pre>
4、小结
1.什么是重定向:将原本要输出到屏幕的数据信息,重新定向到某个指定的文件中。
2.重定向使用场景?
3.标准输入\ 标准输出 错误输出?
程序运行起来后,变为进程, 会同时打开三个文件 标准输入 标准输出 错误输出.
标准输入 0 标准输出 1 错误输出 2 3+
4.标准输入输出 错误\ 与重定向之间有什么关系?
重定向就是用来改变标准输出 或者标准错误输出的一个指向.
1> 标准输出重定向 (覆盖)
1>> 标准输出重定向 (追加)2> 标准错误输出重定向 (覆盖)
2>> 标准错误输出重定向 (追加)
&>/dev/null 混合输出 (覆盖)
&>>/tmp/t.log 混合输出 (追加)
5.输入重定向?
从文件中获取内容. <
6.进程管道技术 |
将左边命令的标准输出 ---传递---> 右边命令的标准输入 --->标准输出| 错误输出
tee 将左边命令的标准输出保存至文件或打印至终端, 但不影响管道数据的一个传递
xargs 用于将不支持管道的命令 支持管道 左边命令的输出作为参数进行传递