zoukankan      html  css  js  c++  java
  • linux I/O重定向及管道

    一,I/O重定向

    • 重定向正常输出

      • > :覆盖以存在文件的内容,很危险的操作

      • >>:如果文件已经存在,则是在原内容的最后追加。

      • 可以禁止>的覆盖行为,使用set -C。只在当前会话有效。

        set +C恢复覆盖行为。

        # set -C
        # cat /etc/issue > /tmp/is1
        -bash: /tmp/is1: cannot overwrite existing file
        # cat /etc/issue >| /tmp/is1
        
      • >|:set -C已经禁止了覆盖,但是确认就是要覆盖,可以使用。

    • 重定向错误输出

      • 2>:覆盖以存在文件的内容,很危险的操作
      • 2>>:如果文件已经存在,则是在原内容的最后追加。
      • 2>|:强制覆盖
    • 合并重定向正常输出和错误输出

      • &>:覆盖以存在文件的内容,很危险的操作
      • &>>:如果文件已经存在,则是在原内容的最后追加。
      • &>|:不支持,语法报错。
    • 把错误输出,重定向到正常输出:2>&1

      # cat /etc/issue2 >> /tmp/is1 2>&1
      

      如果命令产生的是正常输出,则重定向到/tmp/is1;如果产生的是错误输出,则把错误输出重定向到正常输出。由于正常输出已经重定向到了/tmp/is1了,所以错误输出也重定向到了/tmp/is1.

    • 重定向输入:<

      支持文件作为参数的命令,可以不使用< ,也能够重定向输入,比如cat

      # cat < /etc/issue
      S
      Kernel 
       on an m
      # cat /etc/issue
      S
      Kernel 
       on an m
      
      

      不支持文件作为参数的命令,必须明确使用<,才能够重定向输入。比如tr

      tr命令用途:替换或者删除特定的字符

      语法:tr [OPTION]... SET1 [SET2]

      • 把输入的1替换成2,把输入的2替换成4

        $ tr [12] [34]
        12//输入的12
        34//被替换成了34
        22//输入的22
        44//被替换成了44
        
      • 利用重定向,把文件里的小写字母,全部替换成相应的大写字母,把结果显示到标准输出。

        # cat /etc/issue
        S
        Kernel 
         on an m
        # tr [:lower:] [:upper:] < /etc/issue
        S
        KERNEL R ON AN M
        
      • 利用重定向,把文件里的小写字母,全部删除后,把结果显示到标准输出。

        # cat /etc/issue
        S
        Kernel 
         on an m
        # tr -d [a-z] < /etc/issue
        S
        K    
        
    • <<:是干什么的?<<后面的词作为结尾,把内容重定向到文件里

      # cat > /tmp/is1.out << EOF
      > hello
      > cat cat
      > EOF
      # cat /tmp/is1.out
      hello
      cat cat
      
    • 特殊设备:/dev/null

      重定向到/dev/null,就相当于消失了。

      在shell脚本程序里,当关心的是,命令的执行结果(成功,还是失败),而不是命令执行后的输出的时候,就可以把命令的输出重定向到/dev/null里。

      例子:只想知道/etc/passwd文件里是否有第一行,而不关心第一行的内容时,使用下面的命令。

      # head -1 /etc/passwds &> /dev/null
      # echo $?
      1
      # head -1 /etc/passwd &> /dev/null
      # echo $?
      0
      
      

    二,管道

    连接程序,把前一个命令的输出作为后一个命令的输入。

    command1 | command2 | command3 ...

    例子1:把cat的输出,作为tr的输入

    # cat /etc/issue
    S
    Kernel 
     on an m
    # cat /etc/issue | tr [a-z] [A-Z]
    S
    KERNEL R ON AN M
    
    

    例子:把who的输出,作为tail的输入,再把tail的输出,作为tr的输入。

    # who
    ys       :0           2019-12-16 10:22 (:0)
    ys       pts/0        2019-12-16 10:22 (:0)
    root     pts/1        2019-12-16 10:23 ()
    # who | tail -2
    aa       pts/0        2019-12-16 10:22 (:0)
    root     pts/1        2019-12-16 10:23 ()
    # who | tail -2 | tr [a-z] [A-Z]
    AA       PTS/0        2019-12-16 10:22 (:0)
    ROOT     PTS/1        2019-12-16 10:23 ()
    
    

    重定向后,原来命令的输出就没有了,能够保存上一个命令的输出吗?使用tee命令。

    tee:read from standard input and write to standard output and files。从标准输入读取,然后写入到标准输出和文件中。

    例子:保留cat的输出,并把cat的输出,传递给tr命令

    # cat /etc/issue | tee /tmp/is3.out | tr [a-z] [A-Z]
    S
    KERNEL R ON AN M
    # cat /tmp/is3.out
    S
    Kernel 
     on an m
    
    

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

    # head -6 /etc/passwd | tr [a-z] [A-Z]
    ROOT:X:0:0:ROOT:/ROOT:/BIN/BASH
    BIN:X:1:1:BIN:/BIN:/SBIN/NOLOGIN
    DAEMON:X:2:2:DAEMON:/SBIN:/SBIN/NOLOGIN
    ADM:X:3:4:ADM:/VAR/ADM:/SBIN/NOLOGIN
    LP:X:4:7:LP:/VAR/SPOOL/LPD:/SBIN/NOLOGIN
    SYNC:X:5:0:SYNC:/SBIN:/BIN/SYNC
    

    c/c++ 学习互助QQ群:877684253

    本人微信:xiaoshitou5854

  • 相关阅读:
    Linux查看某个端口使用情况并kill
    CentOS 7.0关闭默认防火墙启用iptables防火墙
    Centos7配置JAVA_HOME
    Android Http请求方法汇总
    Android开发总结之 --- 定时,读写文件
    二维码,条形码
    SIM卡相关
    Eclipse快捷键
    easyui datagrid 表格不让选中(双层嵌套)
    easyui datagrid 三层嵌套
  • 原文地址:https://www.cnblogs.com/xiaoshiwang/p/12048500.html
Copyright © 2011-2022 走看看