运维大世界我爱编程

第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
上一篇 下一篇

猜你喜欢

热点阅读