第十二天 重定向 管道
2019-08-10 本文已影响0人
杨小倪
今日内容
- 1 . 什么是重定向?
- 2 . 为什么要使用重定向?
- 3 . 学习重定向需要了解的标准输入、标准输出、错误输出
- 4 . 重定向、追加重定向、案例演示
- 5 . 进程管道技术
1.什么是重定向?
- 重定向就是将原本要输出到屏幕的数据信息,重新定向到某个指定的文件中。
2.为什么要使用重定向
- 1 . 当屏幕输出的信息很重要时,而且希望保存重要信息时
- 2 . 后台执行中的程序,不希望他干扰屏幕正常的输出结果时
- 3 . 系统的例行命令,例如定时任务的执行结果,希望可以保存下来时;
- 4 . 一些执行命令,我们已经知道了他可能会出现错误信息,想将他直接丢弃时;
- 5 . 错误的日志与正确的日志信息需要分别输出之不同的文件,进行保存之时;
重定向的一些符号
< 输出重定向
;cmd1;cmd2无论前者命令执行成功与否,后者命令都执行
&& cmd&&cmd 前者命令执行成功,后者命令才会执行
|| cmd1|| cmd2 前者命令执行失败,后者命令才会执行
& 将程序放入后台执行(screen 将程序放入后台)
3.了解重定向的标准输入、标准输出、错误输出
当运行一个程序时通常会自动打开三个标准文件,分别是标准输入、标准输出、错误输出

进程将从标准输入中得到数据,将正常输出打印至屏幕终端,将错误的输出信息也打印至屏幕终端
PS: 进程是使用文件描述符(file descriptors)来管理打开的文件

以 cat 命令为例, cat 命令的功能是从命令行给出的文件中读取数据,并将这些数据直接送到标准输出。若使用如下命令:
#会把文件/etc/passwd的内容输出显示到屏幕上
[root@xuliangwei ~]# cat /etc/passwd

输出重定向






5.进程管道技术
1.什么是管道
管道操作符“|”,主要用来连接左右两个命令,将左侧的命令的标准输出,交给右侧命令的标准输入
PS:无法传递标准错误输出给后者
管道流程图

管道使用案例
案例一:将/etc/passwd中的用户按uid大小排序
[root@xuliangwei ~]# sort -t":" -k3 -n /etc/passwd
[root@xuliangwei ~]# sort -t":" -k3 -n /etc/passwd -r
[root@xuliangwei ~]# sort -t":" -k3 -n /etc/passwd |head
案例2: 统计当前/etc/passwd 中用户使用的 shell 类型
#思路:取出第七列(shell) | 排序(把相同归类)| 去重
[root@xuliangwei ~]# awk -F: '{print $7}' /etc/passwd
[root@xuliangwei ~]# awk -F: '{print $7}' /etc/passwd |sort
[root@xuliangwei ~]# awk -F: '{print $7}' /etc/passwd |sort |uniq
[root@xuliangwei ~]# awk -F: '{print $7}' /etc/passwd |sort |uniq -c
案例3: 统计网站的访问情况 top 20
#思路: 打印所有访问的连接 | 过滤访问网站的连接 | 打印用户的 IP | 排序 | 去重
[root@xuliangwei ~]# yum -y install httpd
[root@xuliangwei ~]# systemctl start httpd
[root@xuliangwei ~]# systemctl stop firewalld
[root@xuliangwei ~]# ss -an |grep :80 |awk -F":" '{print $8}' |sort |uniq -c
[root@xuliangwei ~]# ss -an |grep :80 |awk -F":" '{print $8}' |sort |uniq -c |sort -k1 -rn |head -n 20
PS: 管道命令符能让大家能进一步掌握命令之间的搭配使用方法,进一步提高命令输出值的处理效率。
管道中的tee技术

#选项: -a追加
[root@xuliangwei ~]# ip addr |grep 'inet ' |tee ip.txt |awk -F"/" '{print $1}' |awk '{print $2}'
127.0.0.1
10.0.0.100
[root@xuliangwei ~]# 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
重定向与tee的区别
[root@xuliangwei ~]# date > date.txt #直接将内容写入date.txt文件中
[root@xuliangwei ~]# date |tee date.txt #命令执行会输出至屏幕,但会同时保存一份至date.txt文件中
xargs参数传递,主要是一些不支持管道的命令可以使用管道技术
# which cat|xargs ls- l
# ls |xargs rm -fv
# ls |xargs cp -rvt /tmp/ -或-> ls | xargs -I {} cp -rv {} /tmp/
# ls |xargs mv -t /tmp/ -或-> ls | xargs -I {} mv {} /tmp