第07章重定向管道
2018-04-17 本文已影响11人
fe8478c7ba2a
输出重定向案例 > <
1.输出重定向及综合案例
简介
输出重定向 (覆盖,追加)
正确输出: 1> 1>> 等价于 > >>
错误输出: 2> 2>>
输出重定向(覆盖):>
输出重定向(追加):>>
错误输出重定向:2>
[root@tianyun ~]# ls /home/ /aaaaaaaaa >list.txt
ls: 无法访问/aaaaaaaaa: 没有那个文件或目录
[root@tianyun ~]# ls /home/ /aaaaaaaaa >list.txt 2>error.txt //重定向到不同的位置
正确和错误都输入到相同位置:&>
正确和错误都输入到相同位置
[root@tianyun ~]# ls /home/ /aaaaaaaaa &> list.txt //混合输出
正确和错误都输入到相同位置:2>&1(了解)
正确和错误都输入到相同位置
[root@tianyun ~]# ls /home/ /aaaaaaaaa >list.txt 2>&1 //重定向到相同的位置
重定向到空设备:>/dev/null
重定向到空设备/dev/null
[root@tianyun ~]# ls /home/ /aaaaaaaaa >list.txt 2>/dev/null //空设备,即将产生的输出丢掉
[root@tianyun ~]# ls /home/ /aaaaaaaaa &>/dev/null //空设备,即将产生的输出丢掉
脚本中使用重定向
[root@tianyun ~]# vim ping.sh
#!/usr/bin/bash
ping -c1 172.16.120.254 &>/dev/null
if [ $? -eq 0 ];then
echo "up.."
else
echo "down.."
fi
[root@tianyun ~]# bash ping.sh
脚本中使用重定向(了解)
# vim ping2.sh
#!/usr/bin/bash
ping -c1 172.16.120.254 &>/dev/null
if [ $? -eq 0 ];then
echo "172.16.120.254 up.." >> /up.txt
else
echo "172.16.120.254 down.." >> /down.txt
fi
# bash ping2.sh
2.输入重定向及结合案例
简介
标准输入: < 等价 0<
案例1:重定向发送邮件
1 观察默认发送邮件的过程。
[root@tianyun ~]# mail -s "ssss" alice //没有改变输入的方向,默认键盘
111
222
333
. //点代表邮件创建结束。
[root@tianyun ~]# su - alice
[alice@tianyun ~]$ mail
Mail version 8.1 6/6/93. Type ? for help.
"/var/spool/mail/alice": 1 message 1 new
>N 1 root@tianyun.local Mon Oct 29 14:09 18/657 "ssss"
&
按邮件编号:1.即可看邮件。
2 使用重定向快速创建邮件
如果已经有了现成的邮件内容呢,如何快速输入邮件内容。
就可以用重定向创建邮件!!!
[root@tianyun ~]# mail -s "test01" alice < /mail.txt
//输入重定向,来自于文件mail.txt是通用邮件。
案例2:在文本中查询字段
案例2:
[root@tianyun ~]# grep 'root' //没有改变输入的方向,默认键盘,此时等待输入...
输入些不带root的词,再输入些带root的词观察结果。
yang sss
sssrootssss..
sssrootssss..
[root@tianyun ~]# grep 'root' < /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
这个方法比较纯理论。
案例3:通过dd命令理解输入输出重定向。(了解)
1 先理解一个命令。dd 快速创建文件。 if输出 of输入 bs大小 count计数
[root@tianyun ~]# dd if=/dev/zero of=/file1.txt bs=1M count=2
ll -h /file1.txt
可以看到文件大小。
[root@tianyun ~]# dd </dev/zero >/file2.txt bs=1M count=20
案例4:mysql表结构导入(了解)
案例4:mysql表结构导入
[root@tianyun ~]# mysql -uroot -p123 < bbs.sql
该案例,需要mysql数据库技术的职称。了解一下即可。
案例5:自动创建任务计划at(了解)
1 先理解at任务计划原理。
[root@tianyun ~]# at now +5 min
at> useradd yang99
at> <EOT> //ctrl+D结束
job 1 at 2015-06-09 11:57
3.综合案例
综合案例1: 利用输入重定向(段落标记EOF)建立多行的文件
[root@tianyun ~]# cat >file4 <<EOF
> 111
> 222
> 333
> EOF
使用<<-EOF结束标记。
管道 |
进程管道 Piping
简介
重定向和管道的区别在于,输出到文件和程序。
• Use redirection characters to control output to files.
• Use piping to control output to other programs.
重定向和管道的符号对比。重定向输出到各种文件。管道是到一个程序。
语法
进程管道
用法:command1 | command2 |command3 |...
示例
[root@tianyun ~]# ll /dev/ |less
[root@tianyun ~]# ps aux |grep 'sshd'
扩展案例(了解)
案例1:排序和管道
案例1:将/etc/passwd中的用户按UID大小排序
1 首先理解一个新命令。sort排序。
[root@tianyun ~]# sort -t":" -k3 -n /etc/passwd //以: 分隔,将第三列按字数升序
[root@tianyun ~]# sort -t":" -k3 -n /etc/passwd -r //逆序
-t 指定字段分隔符--field-separator
-k 指定列
-n 按数值
-r 倒序
2 使用管道和head查看前几行。
[root@tianyun ~]# sort -t":" -k3 -n /etc/passwd |head
案例2:排序和头部 统计出最占CPU的5个进程
[root@tianyun ~]# ps aux --sort=-%cpu |head -6
案例3:取值,排序和去重
案例3:统计当前/etc/passwd中用户使用的shell类型
思路:取出第七列(shell) | 排序(把相同归类)| 去重
[root@tianyun ~]# awk -F: '{print $7}' /etc/passwd
[root@tianyun ~]# awk -F: '{print $7}' /etc/passwd |sort
[root@tianyun ~]# awk -F: '{print $7}' /etc/passwd |sort |uniq
[root@tianyun ~]# awk -F: '{print $7}' /etc/passwd |sort |uniq -c
131 /bin/bash
1 /bin/sync
1 /sbin/halt
63 /sbin/nologin
1 /sbin/shutdown
-F: 指定字段分隔符
$7 第七个字段
uniq 去重
-c 统计
案例4:取值,排序和去重
案例4: 统计网站的访问情况 top 20
1.该实验,需要先部署网站,再需要人访问网站。
yum install -y httpd //安装网站
systemctl start httpd //启动网站
ifconfig //查看自己的IP
setenforce 0 //关闭防火墙
systemctl stop firewalld //关闭防火墙2
2。使用管道过滤出访问量前20名用户。
思路: 打印所有访问的连接 | 过滤访问网站的连接 | 打印用户的IP | 排序 | 去重
[root@tianyun ~]# ss -an |grep :80 |awk -F":" '{print $8}' |sort |uniq -c
4334 192.168.0.66
1338 192.168.10.11
1482 192.168.10.125
44 192.168.10.183
3035 192.168.10.213
375 192.168.10.35
362 192.168.10.39
再看看前20用户。
[root@tianyun ~]# ss -an |grep :80 |awk -F":" '{print $8}' |sort |uniq -c |sort -k1 -rn |head -n 20
案例5:打印当前所有IP
[root@tianyun ~]# ip addr |grep 'inet ' |awk '{print $2}' |awk -F"/" '{print $1}'
127.0.0.1
192.168.2.115
案例6:打印根分区已用空间的百分比(仅打印数字)
[root@tianyun ~]# df -P |grep '/$' |awk '{print $5}' |awk -F"%" '{print $1}'
/$以根结尾的行。
扩展内容:了解awk sed grep sort uniq less more xargs
tee管道
简介
之前的课程,输出的内容给某一个程序。同时输出到别的地方可以吗?比如文件中去。
下面就是管道的分支,支流。一个命令可以有多个管道,通常我们看到的是最后的结果。
如果想看到其中一段的内容,请使用tee。
案例
[root@tianyun ~]# ip addr |grep 'inet ' |tee ip.txt |awk -F"/" '{print $1}' |awk '{print $2}'
127.0.0.1
172.16.60.1
[root@tianyun ~]# cat ip.txt
inet 127.0.0.1/8 scope host lo
inet 172.16.60.1/24 brd 172.16.60.255 scope global eth0
想追加到某个文件,使用-a
[root@tianyun ~]# ip addr |grep 'inet ' |tee -a ip.txt |awk -F"/" '{print $1}' |awk '{print $2}'
127.0.0.1
172.16.60.1
[root@localhost ~]# date
2017年 9月 04日 星期三 08:18:15 CST
[root@localhost ~]# date > 1.txt
[root@localhost ~]# date | tee 1.txt
2017年 9月 04日 星期三 08:18:24 CST
[root@localhost ~]# cat 1.txt
2017年 9月 04日 星期三 08:18:24 CST