IO重定向及管道

作者: 香吉矢 | 来源:发表于2017-08-23 22:19 被阅读0次

    tr,tee

    程序的IO

    简单的说程序由指令(命令)和数据(操作对象)组成,在linux上一切皆文件,程序操作对象(数据)来自系统上的各种文件即程序的输入,由程序处理之后输出的结果即程序的输出

    • 数据的输入与输出
      • 可用于输入的设备:文件,键盘设备、文件系统上的常见文件、网卡等
      • 可用于输出的设备:文件,显示器、文件系统上常见的文件、网卡等
    • 程序数据流的三种状态或形式
      • 输入的数据流:标准输入(stdin),默认为从键盘
      • 输出的数据流:标准输出(stdout),默认输出到显示器
        命令执行所回传的正确的信息
      • 错误输出数据流:错误输出(stderr),默认输出到显示器
        命令执行失败后,所回传的错误信息
    • fd:file descriptor,文件描述符
      简单说,它是一个索引值,指向 内核为每一个进程所维护的该进程打开文件的记录表;
      本人目前的理解只有这么多,后续学习中在进行补充文件描述符的相关知识。
      IO重定向会围绕描述符来展开,列举以下三种文件描述符
      • 标准输入:0
      • 标准输出:1
      • 错误输出:2
    IO重定向

    不使用系统默认的标准输入输出,而是重新指定,即输入重定向,输出重定向,错误输出重定向,双重输出重定向(一次单独地送到不同的地方)。IO重定向其实就是让已创建的FD指向其它的文件(修改其链接的文件)。输入输出数据流的位置用FD标识

    输出重定向
    • 标准输出重定向
      • ,即1>
        特性:覆盖输出
        * >>,即1>>
        特性:追加输出
        * # set -C
        禁止覆盖输出重定向至已存在的文件,只对当前shell进程生效
        此时可使用强制覆盖输出:>|
        * # set +C
        关闭上述特性

    • 错误输出重定向
      • 2>
        特性:覆盖追加输出
      • 2>>
        特性:追加错误输出
    • 合并标准输出流和错误输出流
      • &>,覆盖合并
      • &>>,覆盖追加
      • COMMAND > /path/to/somefile 2>&1,前面>是覆盖后面>就是覆盖
      • COMMAND >> /path/to/somefile 2>&1,前面>>是追加后边的>就是追加
    • 特殊设备:/dev/null
      将输出的数据丢到此目录,所有的数据都会无声无息被丢弃。根据命令的执行结果可以判断目录及文件的存在与否及内容有无
    输入重定向

    <,会经常和tr命令一起使用。介绍下tr命令的用法

    • image.png
    • Here Document :<<,此处创建文档

      • cat << EOF
      • cat > /PATH/TO/SOMEFILE << EOF
    管道

    链接程序,实现前一个命令的输出直接定向到后一个程序并当作输入数据流(Linux的哲学思想)
    只会将最后一个命令的执行结果,作为标准输出,前面的命令的输出都会作为下一个命令的输入,不会在屏幕上显示了。
    COMMAND1 | COMMAND2 | COMMAND3 |……
    管道符与tee命令结合使用,将前一个命令的标准输出保存一份,然后继续通过管道符送到下一个命令,实现命令分方向发送。tee介绍如下:

    • image.png
    相关演示

    [root@localhost mytest]# touch fedora   \\创建一个空文件
    [root@localhost mytest]# ll
    总用量 0
    -rw-r--r--. 1 root root 0 8月 13 22:50 fedora
    [root@localhost mytest]# echo diyihang > fedora   \\将echo回显的内容重定向到fedora
    [root@localhost mytest]# cat fedora   
    diyihang
    [root@localhost mytest]# echo dierhang > fedora   \\覆盖重定向,第一次的内容被覆盖
    [root@localhost mytest]# cat fedora
    dierhang
    [root@localhost mytest]# echo desanhang >> fedora   \\追加重定向
    [root@localhost mytest]# cat fedora
    dierhang
    desanhang
    [root@localhost mytest]# set -C   \\禁止重定向覆盖已存在的文件,即使文件为空的。
    [root@localhost mytest]# echo disihang > fedora   
    -bash: fedora: 无法覆盖已存在的文件
    [root@localhost mytest]# echo disihang >> fedora   \\只可以追加
    [root@localhost mytest]# cat fedora
    dierhang
    desanhang
    disihang
    [root@localhost mytest]# echo dierhang >| fedora   \\强制覆盖
    [root@localhost mytest]# cat fedora
    dierhang
    [root@localhost mytest]# set +C   \\取消进制覆盖重定向
    [root@localhost mytest]# echo diyihang > fedora
    [root@localhost mytest]# cat fedora
    diyihang
    [root@localhost mytest]# > fedora
    [root@localhost mytest]# cat fedora
    [root@localhost mytest]# echo dierhang > suse   \\重定向的文件不存在,会自动创建此文件
    [root@localhost mytest]# ll
    总用量 8
    -rw-r--r--. 1 root root 9 8月 13 22:54 fedora
    -rw-r--r--. 1 root root 9 8月 13 22:54 suse
    [root@localhost mytest]# cat suse
    dierhang
    [root@localhost mytest]# > centos   \\重定向到新文件,什么也没有,即创建空文件,相当于touch
    [root@localhost mytest]# ll
    总用量 8
    -rw-r--r--. 1 root root 0 8月 13 22:54 centos
    -rw-r--r--. 1 root root 9 8月 13 22:54 fedora
    -rw-r--r--. 1 root root 9 8月 13 22:54 suse
    [root@localhost mytest]# ll centos1
    ls: 无法访问centos1: 没有那个文件或目录
    [root@localhost mytest]# ll centos1 2> ubuntu
    [root@localhost mytest]# cat ubuntu
    ls: 无法访问centos1: 没有那个文件或目录
    [root@localhost mytest]# ll centos2 2>> ubuntu
    [root@localhost mytest]# cat ubuntu
    ls: 无法访问centos1: 没有那个文件或目录
    ls: 无法访问centos2: 没有那个文件或目录
    [root@localhost mytest]# cat fedora
    diyihang
    [root@localhost mytest]# cat fedora &> suse   \\合并重定向
    [root@localhost mytest]# cat suse
    diyihang
    [root@localhost mytest]# cat fedora1 &>> suse
    [root@localhost mytest]# cat suse
    diyihang
    cat: fedora1: 没有那个文件或目录
    [root@localhost mytest]# cat fedora1
    cat: fedora1: 没有那个文件或目录
    [root@localhost mytest]# cat fedora1 > suse 2>&1
    [root@localhost mytest]# cat suse
    cat: fedora1: 没有那个文件或目录
    [root@localhost mytest]# cat fedora > suse 2>&1
    [root@localhost mytest]# cat suse
    diyihang
    [root@localhost mytest]# cat fedora1 >> suse 2>&1
    [root@localhost mytest]# cat suse
    diyihang
    cat: fedora1: 没有那个文件或目录
    [root@localhost mytest]# ls /tmp/mytest/
    centos fedora suse ubuntu
    [root@localhost mytest]# ls /tmp/mytest1 &> /dev/null   \\可以通过合并重定向到null文件,根据命令执行的状态值,判断是否有该目录。
    [root@localhost mytest]# echo $?   \\返回值为2,命令执行失败,所以没有mytest1目录
    2
    [root@localhost mytest]# ls /tmp/mytest &> /dev/null
    [root@localhost mytest]# echo $?   \\返回值为0,命令执行成功,所以有mytest目录
    0
    [root@localhost mytest]# cat fedora
    diyihang
    dierhang
    disanhang
    disiheng
    5diwuhang6
    di6hang
    [root@localhost mytest]# tr [a-z] [A-Z] < fedora   \\通过符号"<"将文件的内容送给命令tr处理,即将所有小写字母,变为大写。"<"后边为已经存在的文件
    DIYIHANG
    DIERHANG
    DISANHANG
    DISIHENG
    5DIWUHANG6
    DI6HANG
    [root@localhost mytest]# cat fedora
    diyihang
    dierhang
    disanhang
    disiheng
    5diwuhang6
    di6hang
    [root@localhost mytest]# tr -d "hang" < fedora   \\删除fedora中出现的字符串hang,非单词。
    diyi
    dier
    dis
    disie
    5diwu6
    di6
    [root@localhost mytest]# tr -d "[[:digit:]]" < fedora
    diyihang
    dierhang
    disanhang
    disiheng
    diwuhang
    dihang
    [root@localhost mytest]# tr -d "[0-9]" < fedora
    diyihang
    dierhang
    disanhang
    disiheng
    diwuhang
    dihang
    [root@localhost mytest]# ll
    总用量 12
    -rw-r--r--. 1 root root 0 8月 13 22:54 centos
    -rw-r--r--. 1 root root 56 8月 13 23:33 fedora
    -rw-r--r--. 1 root root 51 8月 13 23:26 suse
    -rw-r--r--. 1 root root 106 8月 13 22:57 ubuntu
    [root@localhost mytest]# ll | head -2   \\通过ll命令的输出作为输入交给head -2处理,后者处理后输出到屏幕
    总用量 12
    -rw-r--r--. 1 root root 0 8月 13 22:54 centos
    [root@localhost mytest]# ll | tee suse | head -2   \\将ll命令输出的内容,复制一份到suse,然后继续交由下一个命令处理
    总用量 12
    -rw-r--r--. 1 root root 0 8月 13 22:54 centos
    [root@localhost mytest]# cat suse
    总用量 12
    -rw-r--r--. 1 root root 0 8月 13 22:54 centos
    -rw-r--r--. 1 root root 56 8月 13 23:33 fedora
    -rw-r--r--. 1 root root 51 8月 13 23:26 suse
    -rw-r--r--. 1 root root 106 8月 13 22:57 ubuntu
    [root@localhost mytest]# ls | tee suse | grep centos
    centos
    [root@localhost mytest]# cat suse
    centos
    fedora
    suse
    ubuntu
    [root@localhost mytest]# ls fedora | tee -a suse | tr [a-z] [A-Z]    \\此处tr处理的字符是前一个命令的输出通过管道符做为输入交给其处理,tee -a追加到文件。
    FEDORA
    [root@localhost mytest]# cat suse
    centos
    fedora
    suse
    ubuntu
    fedora
    [root@localhost mytest]#

    相关文章

      网友评论

        本文标题:IO重定向及管道

        本文链接:https://www.haomeiwen.com/subject/blnjdxtx.html