I/O重定向与 管道

A、三种I/O设备

            标准输入(stdin)    -0  #默认接受来自键盘的输入

            标准输出(stdout)  -1 #默认输出到终端窗口

            错误输出(stderr)  -2 #默认输出到终端窗口

B、把I/O重定向至文件

        a、标准输出(stdout)和错误输出(stderr)可以重定向到文件,I/O重定向:指的是改变默认输入或输出。

        >    #把stdout重定向到文件          #1> 同 >  ;1>>  同 >>

        2>  #把stderr重定向到文件

        &>  #把所有输出重定向到文件

实例:

        】$ find /etc/ -name "*.conf"  >all.txt        #正确信息输出到all.txt文件

        】$ find /etc/ -name "*.conf"  >all.txt  2>&1

        】$ find /etc/ -name "*.conf"  &>all.txt       #所有信息(包含错误)到all.txt文件

        】$ find /etc/ -name "*.conf"  2> find.error  > find.correct

    b、文件内容是否会被覆盖参数

            set -C  #禁止将内容覆盖已有文件,但可以追加【>>】。 在这个模式下,使用 【 >| file 】是强制覆盖。

            set +C  #默认允许覆盖

实例:

        】# cat /etc/redhat-release >win1.txt

                - bash: win1.txt: cannot overwrite existing file #>报错

        】# cat /etc/redhat-release >>win1.txt  #>>正常输出到文件

        】# cat win1.txt

            CentOS Linux release 7.5.1804 (Core)

注释:

    > 若文件不存在,则创建,并将正确的输出填充,若文件已存在,则覆盖原内容

    >> 若文件不存在,则创建,并将正确的输出内容填充,若文件已存在,则追加内容

    2> 若文件不存在,则创建,并将错误的输出填充,若文件已存在,则覆盖原内容

    2>> 若文件不存在,则创建,并将错误的输出内容填充,若文件已存在,则追加内容

    &> 若文件不存在,则创建,并将所有的输出填充,若文件已存在,则覆盖原内容

    &>> 若文件不存在,则创建,并将所有的输出内容填充,若文件已存在,则追加内容

    >file 2>&1 若文件不存在,则创建,并将所有的输出填充,若文件已存在,则覆盖原内容

    /dev/null  #特殊设备【黑洞】,所有重定向到这里的信息都将丢失。

    c、重定向输入,可以从文件中导入(stdin),已可以多行发送给(stdin)

        1)、使用【<】来重定向标准输入

        2)、某些命令能够接受从文件中导入的STDIN

        tr –d abc < /etc/fstab 删除fstab文件中的所有abc中任意字符

    实例:

            】cat > file

                mage

                wangxiaochun

        按ctrl+d离开,可以使用文件来代替键盘的输入

        3)、使用“<<终止词”命令从键盘把多行重导向给STDIN

实例:

       】 cat > /app/test.txt << EOF

        hello

        123

        nihao

        EOF

    C、管道 |

        管道(使用符号“|”表示)用来连接命令;  格式:命令1 | 命令2 | 命令3 | …

        “|” 管道只将正确结果传递给右边的命令用,STDERR默认不能通过管道转发,可利用2>&1 或 |& 实现。

注释:

                2>&1 将错误结果转为正确结果 

                |& 将正确及错误都传递给右边命令用

                1>&2 将正确结果转为错误结果

实例:

                】$ find /etc/ -name "*.conf" |& wc -l

                】# ls /boot /error |& tr 'a-z' 'A-Z' #新方法在Centos5里不能使用

                】# ls /boot /error 2>&1 | tr 'a-z' 'A-Z'

  D、tr 转换和删除字符

           tr [OPTION]... SET1 [SET2]

                选项

                    -c    #取字符集的补集

                    -d    #删除所有属于第一个字符集的字符

                    -s     #替换连续重复的字符,并单独以一个字符表示。

                    -t     #将第一个字符集对应字符转化为第二个字符集对应的字符

实例:

        】ls | tr ‘a-z’ ‘A-Z’

            df | tr -s  ''   ''

            echo abcdef | tr -t 'abcd' 'xyz'

----------------------------------------------------------------------------------

练习:从1加到100,取和

[root@instructor_v7(nanyibo) ~]# echo {1..100} |tr " " + |bc

5050

[root@instructor_v7(nanyibo) ~]# echo {1..100} |tr [:blank:] + |bc

5050

----------------------------------------------------------------------------------

F、重定向到多个目标

命令1 | tee 文件名 | 命令

    选项:

            -a 追加

实例:

[root@centos7 app]# ls | tee -a ls.log      #标准输出(stdout),并把内容重定向到ls.log文件里。

        】ls.log

            passwd

            win1

[root@centos7 app]# enable |tee /app/456 |wc -l           #enable的内部命令输出到456里,并计算行数。

你可能感兴趣的:(I/O重定向与 管道)