美文网首页
I/O重定向与 管道

I/O重定向与 管道

作者: xue2007 | 来源:发表于2018-05-23 08:36 被阅读0次

    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重定向与 管道

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