Linux——標準I/O以及管道

標準I/O以及管道



目錄

一、什麼是I/O

二、什麼是管道

三、三種I/O設備

四、把I/O輸出錯誤重定向入文件

五、tr

六、從文件中導入STDIN

七、使用管道鏈接命令

八、tee




一、什麼是I/O

    I/O(input/output),即輸入/輸出端口

    每個設備都會有一個專用的I/O地址,用來處理自己的輸入輸出信息。CPU與外部設備存儲器的連接和數據交換都需要通過接口設備來實現,前者被稱爲I/O接口,而後者則被稱爲存儲器        接口。存儲器通常在CPU的同步控制下工作,接口電路比較簡單;而I/O設備品種繁多,其相應的接口電路也各不相同,因此,習慣上說到接口只是指I/O接口。


二、什麼是管道

    管道是Linux支持的最初UnixIPC形式之一管道和有名管道是最早的進程間通信機制之一,管道可用於具有親緣關係進程間的通信,有名管道克服了管道沒有名字的限制,因此,除具有        管道所具有的功能外,它還允許無親緣關係進程間的通信。

    具有以下特點:管道是半雙工的,數據只能向一個方向流動;需要雙方通信時,需要建立起兩個管道;只能用於父子進程或者兄弟進程之間(具有親緣關係的進程);單獨構成一種獨立        的文件系統:管道對於管道兩端的進程而言,就是一個文件,但它不是普通的文件,它不屬於某種文件系統,而是自立門戶,單獨構成一種文件系統,並且只存在與內存中。數據的讀出        和寫入:一個進程向管道中寫的內容被管道另一端的進程讀出。寫入的內容每次都添加在管道緩衝區的末尾,並且每次都是從緩衝區的頭部讀出數據。


三、三種I/O設備

    1、標準輸入(STDIN)-0

        輸入設備:鍵盤、鼠標、麥克風、攝像頭、掃描儀

    2、標準輸出(STDOUT)-1默認輸出到終端窗口

        輸出設備:顯示器、打印機、音響、耳機

    3、標準錯誤(STDERR)-2默認輸出到終端窗口


四、把I/O輸出錯誤重定向入文件

    1、STDOUT和STDERR可以被重定向到文件:

        command  操作符號  file

    2、支持的操作符號包括:
        >    把STDOUT重定向到文件
        2>   把STDERR重定向到文件
        &>  把所有輸出重定向到文件
    3、> 文件內容會被覆蓋
        set -C: 禁止將內容覆蓋已有文件,但可追加
        >| file:強制覆蓋
        set +C: 允許覆蓋

    4、>> 原有內容基礎上,追加內容

    5、2>: 覆蓋重定向錯誤輸出數據流
    6、2>>: 追加重定向錯誤輸出數據流
   7、 標準輸出和錯誤輸出各自定向至不同位置
        COMMAND > /path/to/file.out2> /path/to/error.out
    8、合併標準輸出和錯誤輸出爲同一個數據流進行重定向
        &>覆蓋重定向
        &>> 追加重定向
        COMMAND > /path/to/file.out2>&1 (順序很重要)
        COMMAND >> /path/to/file.out2>&1
    9、():合併多個程序的STDOUT
        (cal2007;cal2008)> all.txt


五、tr

    1、tr轉換和刪除字符
    2、tr[OPTION]... SET1 [SET2]
    3、選項:
        -c–C --complement:取字符集的補集
        -d--delete:刪除所有屬於第一字符集的字符
        -s--squeeze-repeats:把連續重複的字符以單獨一個字符表示
        -t--truncate-set1:將第一個字符集對應字符轉化爲第二字符集對應的字符
    4、通配符

        [:alnum:]:字母和數字

        [:alpha:]:字母

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

        [:digit:]:數字

        [:graph:]:圖形字符

        [:lower:]:小寫字母

        [:print:]:可打印字符

        [:punct:]:標點符號

        [:space:]:空白字符

        [:upper:]:大寫字母

        [:xdigit:]:十六進制字符


六、從文件中STDIN

    1、使用<來重定向標準輸入
    2、某些命令能夠接受從文件中導入的STDIN
        tr‘a-z’‘A-Z’</etc/issue
        該命令會把/etc/issue中的小寫字符都轉換成寫寫字符
    3、 tr–d abc< /etc/fstab刪除fstab文件中的所有abc中任意字符
    4、cat > file
        mage
        wangxiaochun
        按ctrl+d離開,可以使用文件來代替鍵盤的輸入   

    5、cat > filea< fileb


六、使用管道鏈接命令

    1、管道(使用符號“|”表示)用來連接命令
        命令1 | 命令2 | 命令3 | …
            將命令1的STDOUT發送給命令2的STDIN,命令2的STDOUT發送到命令3的STDIN
            STDERR默認不能通過管道轉發,可利用2>&1 或|& 實現
            最後一個命令會在當前shell進程的子shell進程中執行用來
            組合多種工具的功能
            ls | tr 'a-z' 'A-Z'

    2、less :一頁一頁地查看輸入
        ls-l/etc|less

    3、mail:通過電子郵件發送輸入
        echo"testemail"|mail-s "test"[email protected]

    4、lpr:把輸入發送給打印機
        echo"testprint"|lpr-Pprinter_name

    5、- 符號

        示例:
            將/home 裏面的文件打包,但打包的數據不是記錄到文件,而是傳送到stdout,經過管道後,將tar -cvf-/home 傳送給後面的tar -xvf-, 後面的這個-則是取前一個命令的stdout,  因此,就不需要使用臨時file了

                tar -cvf-/home | tar -xvf-


七、重定向到多個目標(tee)

    1、命令1 | tee[-a ] 文件名| 命令2
        把命令1的STDOUT保存在文件中,做爲命令2的輸入
        -a 追加

    2、使用:
        保存不同階段的輸出
        複雜管道的故障排除
        同時查看和記錄輸出

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