天天看點

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,如需轉載請自行聯系原作者