Linux基礎入門--IO重定向及管道


IO重定向及管道

  

一直都提到,程序:指令+數據

  其實程序也有IO,數據的來源有多個地方:文件、外部


可用於輸入的設備:文件(linux一切皆文件)

  鍵盤設備、文件系統上的常規文件加載內容、網卡等;

可用於輸出的設備:文件(linux一切皆文件)

  顯示器、文件系統上的常規文件輸出保存、網卡等;


程序的數據流有三種:

  輸入的數據流;<-- 標準輸入(stdin),是鍵盤;

  輸出的數據流:--> 標準輸出(stdout),顯示器;

  錯誤輸出流:  --> 錯誤輸出(stderr),顯示器;


fd: file descriptor,文件描述符;所對應標識符如下:

  標準輸入:0

  標準輸出:1

  錯誤輸出:2


IO重定向:

  輸出重定向:>

    特性:覆蓋輸出,將anaconda-ks.cfg文件內容覆蓋到kk.txt中 

    [root@test7_1 ~]# cat anaconda-ks.cfg > kk.txt


  輸出重定向:>>

    特性:追加輸出,從文件尾部加入

    [root@test7_1 ~]# cat anaconda-ks.cfg >> kk.txt


  錯誤輸出流重定向:2>,2>>(追加)

    [root@test7_1 sh]# cat test.txt 2> error.log

    [root@test7_1 sh]# cat error.log 

    cat: test.txt: No such file or directory


    [root@test7_1 sh]# cat test.log 2>> error.log

    [root@test7_1 sh]# cat error.log 

    cat: test.txt: No such file or directory

    cat: test.log: No such file or directory

    


  合併正常輸出流和錯誤輸出流:

    合併輸出流也是有覆蓋和追加兩種方式:

      (1) &>, &>>

      (2) COMMAND > /path/to/somefile 2>&1

        COMMAND >> /path/to/somefile 2>&1

        [root@centos7 tmp]# cat /root/anaconda-ks.cfg >> an.cfg 2>&1

        註解:查看anaconda-ks.cfg文件內容追加到an.cfg中,如有錯誤輸出也將追加到an.cfg文             件中;


  提一下特殊設備:/dev/null

    此特殊設備理解爲“數據黑洞”,所有的數據扔進去就會被刪除


  set爲shell內部命令,可以設置禁止覆蓋輸出重定向至已存在文件;(Centos 6)

   [root@test1 ~]# set -C

   [root@test1 ~]# cat fstab > issue 

   -bash: issue: cannot overwrite existing file

  

  如果將開啓後無法使用重定向功能,此時可使用強制覆蓋輸出:>|:

   [root@test1 ~]# cat fstab >| issue


  關閉上述特性:

   [root@test1 ~]# set +C


   注:set設定只對當前shell生效


 

  輸入重定向:<

    輸入重定向就是將“數據”作爲命令的數據輸入源,從而對數據做一些操作


    先來一個命令:

      tr命令:

        tr - translate or delete characters

        格式:

          tr [OPTION]... SET1 [SET2]

            把輸入的數據當中的字符,凡是在SET1定義範圍內出現的,通通一一對位轉換爲               SET2出現的字符


        選項:

          -d:刪除字符集合

             

        示例1:

          tr SET1 SET2 < /PATH/FROM/SOMEFILE

          [root@test7_1 sh]# tr S s < ./issue 

          \s

          Kernel \r on an \m


          註解:將issue中出現所有大寫S,轉換成小寫s


        示例2:

          tr -d SET1 < /PATH/FROM/SOMEFILE

          [root@test7_1 sh]# tr -d S < ./issue

          \

          Kernel \r on an \m

 

        注意:不修改原文件


    Here Document(此處創建文檔):<<

    結束符操作兩種方式:

      cat << EOF

      cat > /PATH/TO/SOMEFILE << EOF



      示例:

        [root@test7_1 sh]# cat << EOF

        > hello

        > EOF

        hello


      解釋:

        EOF爲結束符,當輸入的內容中有EOF時會退出



管道:

  連接程序作用,實現將前一個命令的輸出直接定向後一個程序當做輸入數據流

  可以多級連接:

    COMMAND1 | COMMAND2 | COMMAND3 | ...



  管道符號: |

    [root@test7_1 sh]# cat /etc/issue | tr COS cos


  tee命令:

    雙向管道,意思是輸入數據流保留並在次向後一個程序當做輸入數據流

    

    格式: 

      COMMAND | tee /PATH/TO/SOMEFILE


    示例:

      [root@test1 ~]# cat /etc/issue | tee kkk | tr -d '6.4'

      CentOS release  (Final)

      Kernel \r on an \m

      [root@test1 ~]# cat kkk

      CentOS release 6.4 (Final)

      Kernel \r on an \m




    練習1:把/etc/passwd文件的前6行的信息轉換爲大寫字符後輸出;

       [root@test1 ~]# head -n 6 /etc/passwd | tr 'a-z' 'A-Z'




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章