首页 > 代码库 > Linux基础入门--IO重定向及管道

Linux基础入门--IO重定向及管道


IO重定向及管道

  

一直都提到,程序:指令+数据

  其实程序也有IO,数据的来源有多个地方:文件、外部


可用于输入的设备:文件(linux一切皆文件)

  键盘设备、文件系统上的常规文件加载内容、网卡等;

可用于输出的设备:文件(linux一切皆文件)

  显示器、文件系统上的常规文件输出保存、网卡等;


程序的数据流有三种:

  输入的数据流;<-- 标准输入(stdin),是键盘;

  输出的数据流:--> 标准输出(stdout),显示器;

  错误输出流:  --> 错误输出(stderr),显示器;


fd: file descriptor,文件描述符;所对应标识符如下:

  标准输入:0

  标准输出:1

  错误输出:2


IO重定向:

  输出重定向:>

    特性:覆盖输出,将anaconda-ks.cfg文件内容覆盖到kk.txt中 

    [root@test7_1 ~]# cat anaconda-ks.cfg > kk.txt


  输出重定向:>>

    特性:追加输出,从文件尾部加入

    [root@test7_1 ~]# cat anaconda-ks.cfg >> kk.txt


  错误输出流重定向:2>,2>>(追加)

    [root@test7_1 sh]# cat test.txt 2> error.log

    [root@test7_1 sh]# cat error.log 

    cat: test.txt: No such file or directory


    [root@test7_1 sh]# cat test.log 2>> error.log

    [root@test7_1 sh]# cat error.log 

    cat: test.txt: No such file or directory

    cat: test.log: No such file or directory

    


  合并正常输出流和错误输出流:

    合并输出流也是有覆盖和追加两种方式:

      (1) &>, &>>

      (2) COMMAND > /path/to/somefile 2>&1

        COMMAND >> /path/to/somefile 2>&1

        [root@centos7 tmp]# cat /root/anaconda-ks.cfg >> an.cfg 2>&1

        注解:查看anaconda-ks.cfg文件内容追加到an.cfg中,如有错误输出也将追加到an.cfg文             件中;


  提一下特殊设备:/dev/null

    此特殊设备理解为“数据黑洞”,所有的数据扔进去就会被删除


  set为shell内部命令,可以设置禁止覆盖输出重定向至已存在文件;(Centos 6)

   [root@test1 ~]# set -C

   [root@test1 ~]# cat fstab > issue 

   -bash: issue: cannot overwrite existing file

  

  如果将开启后无法使用重定向功能,此时可使用强制覆盖输出:>|:

   [root@test1 ~]# cat fstab >| issue


  关闭上述特性:

   [root@test1 ~]# set -C

   注:set设定只对当前shell生效


 

  输入重定向:<

    输入重定向就是将“数据”作为命令的数据输入源,从而对数据做一些操作


    先来一个命令:

      tr命令:

        tr - translate or delete characters

        格式:

          tr [OPTION]... SET1 [SET2]

            把输入的数据当中的字符,凡是在SET1定义范围内出现的,通通一一对位转换为               SET2出现的字符


        选项:

          -d:删除字符集合

             

        示例1:

          tr SET1 SET2 < /PATH/FROM/SOMEFILE

          [root@test7_1 sh]# tr S s < ./issue 

          \s

          Kernel \r on an \m


          注解:将issue中出现所有大写S,转换成小写s


        示例2:

          tr -d SET1 < /PATH/FROM/SOMEFILE

          [root@test7_1 sh]# tr -d S < ./issue

          \

          Kernel \r on an \m

 

        注意:不修改原文件


    Here Document(此处创建文档):<<

    结束符操作两种方式:

      cat << EOF

      cat > /PATH/TO/SOMEFILE << EOF


      示例:

        [root@test7_1 sh]# cat << EOF

        > hello

        > EOF

        hello


      解释:

        EOF为结束符,当输入的内容中有EOF时会退出



管道:

  连接程序作用,实现将前一个命令的输出直接定向后一个程序当做输入数据流

  可以多级连接:

    COMMAND1 | COMMAND2 | COMMAND3 | ...


  管道符号: |

    [root@test7_1 sh]# cat /etc/issue | tr COS cos


  tee命令:

    双向管道,意思是输入数据流保留并在次向后一个程序当做输入数据流

    

    格式: 

      COMMAND | tee /PATH/TO/SOMEFILE


    示例:

      [root@test1 ~]# cat /etc/issue | tee kkk | tr -d ‘6.4‘

      CentOS release  (Final)

      Kernel \r on an \m

      [root@test1 ~]# cat kkk

      CentOS release 6.4 (Final)

      Kernel \r on an \m


    练习1:把/etc/passwd文件的前6行的信息转换为大写字符后输出;

       [root@test1 ~]# head -n 6 /etc/passwd | tr ‘a-z‘ ‘A-Z‘



本文出自 “变相怪杰” 博客,请务必保留此出处http://waldenkk.blog.51cto.com/2410270/1929948

Linux基础入门--IO重定向及管道