天天看点

I/O重定向和管道

一、标准输入和标准输出

    1.程序:指令+数据;

        数据:

            读入数据:Input

            输出数据:Output

    2.打开的文件都有一个fd:file descriptor(文件描述符)

    3.Linux给程序提供的三种I/O设备:

        标准输入:0,默认接受来自键盘的输入;

        标准输出:1,显示器(默认输出到终端窗口)

        标准错误输出:2,显示器(默认输出到终端窗口)

二、把标准输出和标准错误输出重定向到文件

    1.标准输出和标准错误输出可以被重定向到文件:

        格式:命令 操作符号 文件名;

        支持的操作符号:

            >:把标准输出重定向到文件;

            2>:把标准错误输出重定向到文件;

            &>:把标准输出和标准错误输出重定向到文件;

    2.输出重定向:COMMAND > NEW_POS,COMMAND >> NEW_POS;

        >:覆盖重定向:文件不存在,则会自动创建;文件如果有内容,则会覆盖;

            eg:ls > /testdir/is.log

        >>:追加重定向,在原有内容基础上,追加内容;新内容会追加至目标文件尾部;

            eg:uname -r >> /testdir/is.log

        set -C:禁止将内容覆盖已有文件,但可追加;强制覆盖:>|;

        set +C:允许覆盖;

        2>:覆盖重定向标错误输出数据流;

            eg:aaaaa 2> /testdir/is.log

        2>>:追加重定向错误输出数据流;

            eg:bbbbb 2>> /testdir/is.log

        标准输出和错误输出各自定向至不同位置:

            COMMAND > /path/to/somfile 2> /path/to/err.out

            eg:ls /boot /ddddd /testdir/f1 2> /testdir/f2

        合并标准输出和错误输出为同一个数据流进行重定向:

            &>:覆盖重定向;

            &>>:追加重定向;

                COMMAND &> /path/to/file.out;

                    eg:ls /boot /ddddd &> /testdir/all.log

                COMMAND &>> /path/to/dile.out

                    eg:ls /boot /ddddd &>> /testdir/all.log

    3.():合并多个程序的标准输出

          eg:(pwd;ls) > /testdir/all.log

三、输入重定向:<

    1.tr命令

        tr:转换或删除字符;

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

        字符集1:指定要转换或删除的原字符集。当执行转换操作时,必须使用参数“字符集2”指定转换的目标字符集。但执行删除操作时,不需要参数“字符集2”;

         字符集2:指定要转换成的目标字符集。

    OPTION:

        -c:取字符集的补集(也就是取反);

        -d:删除所有属于第一字符集的字集;

        -s:把连续重复的字符以单独一个字符表示;也可以用-s来转换字符(等同于tr [a-z] [A-Z] < /etc/issue);

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

    字符集表示方法:

        [:lower:]:任意小写字母;

        [:upper:]:任意大写字母;

        [:alpha:]:任意大小写字母(不区分大小写);

        [:alnum:]:任意数字和字母;

        [:blank:]:水平空白字符;

        [:space:]:水平或垂直空白字符;

        [:punct:]:标点符号;

        [:print:]:可打印字符;

        [:cntrl:]:控制(非打印)字符;

        [:graph:]:图形字符;

        [:xdigit:]:十六进制字符;   

    速记符含义八进制方式

        \b Ctrl-H 退格符\010

        \f Ctrl-L 走行换页\014

        \n Ctrl-J 新行\012

        \r Ctrl-M 回车\015

        \t Ctrl-I tab键\011

    eg1:tr 'abc' 'xyz':这里不是将abc转换成xyz,是对应转换,a转换成x,b转换成y,c转换成z;

    eg2:tr 'abc' 'xy':a转换成x,b转换成y,c转换成z;由于c没有对应转换项,会在xy后自动加个y来形成对应关系;

    eg3:tr 'ab' 'xyz'::a转换成x,b转换成y,c转换成z;由于没有与z形成对应关系的项,它不会自动添加项;

    eg4:tr 'a-z' 'A-Z' < /etc/issue;将文件中的小写字母转换成大写字母;

    eg5:tr 'a-z' 'A-Z' < /etc/issue > f1;将文件中的小写字母转换成大写字母并重定向到f1文件中;

    eg5:tr -s

    eg6:tr -d

    【注意】这里,凡是在file文件中出现的'S','n','a','i','l'字符都会被删除!而不是紧紧删除出现的"Snail”字符串。

    eg7:tr -c

四、多行标准输入重定向

    1.使用“<<终止词”命令从键盘把重导向给标准输入;

        eg1:

        eg2:用来发邮件

五、管道

    1.管道(使用符号“|”表示)用来连接命令;

        命令1 | 命令2 | 命令3 | ...

            1.1.将命令1的标准输出送给命令2的标准输入,命令2的标准输出送给命令3的标准输入;

                注:最后一个命令会在当前shell进程的子shell进程中执行;

                    eg1:ls | tr 'a-z' 'A-Z'

                    eg2:echo centos7 | passwd --stdin wu > /dev/null

            1.2.标准错误输出默认不能通过管道转发,可利用2>&1或|&实现;

                    eg: ls aaaaa |& tr 'a-z' 'A-Z'

六、重定向到多个目标(tee)

    tee命令:从标准输入读取并写入标准输出和文件

    1.命令1 | tee 文件名 | 命令2

        把命令1的标准输出保存在文件名中,然后管道输入给命令2;

    2.使用:

        2.1.保存不同阶段的输出;

        2.2.同时查看和记录输出

    eg:who | tee f1 | tr 'a-z' 'A-Z'

      本文转自wzcLINUXER 51CTO博客,原文链接:http://blog.51cto.com/yacheng0316/1951921,如需转载请自行联系原作者