初學Linux之標準 I/O 和管道

前面我們已經了解了文件系統的部分內容,我們可以通過 ls 命令讓當前目錄下的內容都顯示在屏幕上,也可以使用 pwd 命令,顯示當前的所在的目錄路徑。但是我們輸入的是命令,本身并沒有輸入“顯示”這類命令和要求,但是系統就自動的在屏幕上輸出我們命令指定的信息。由此可以想象到,系統自身有默認的一種輸出方式,同時,有輸出就有輸入,當輸入的和系統無關,系統也會自動提示錯誤,以上就是我們接下來要了解的基礎內容——標準 I/O。具體的涉及內容包括:三種 I/O 設備,把 I/O 重定向入文件,tr 命令的使用,使用管道鏈接命令。

初學Linux之標準 I/O 和管道

通常對于程序來講,輸入輸出數據的可以是鍵盤、鼠標、顯示器等設備。但是我們輸入的是命令,本身并沒有輸入“顯示”這類命令和要求,但是系統就自動的在屏幕上輸出我們命令指定的信息。系統本身默認對一些命令的輸出進行了規范,這樣也是減少了我們在使用Linux 過程中對輸出的考慮,簡化了不必要的繁瑣的操作。對于這些默認的輸入和輸出,我們需要進行了解,這樣對后面的程序學習以及腳本編輯都很有幫助。

一、三種標準 I/O

程序一般包括指令和數據,讀入數據就是 Input ,輸出數據是 Output ,在Linux中,一切皆文件,系統不會識別到具體的文件名,它是通過文件的(fd)文件描述符(數字代號)識別的,若是把鍵盤和屏幕都是作為文件,那么它們的 fd 是多少呢?下圖我們通過一個已經打開的進程(7525),從進程中顯示的三個編號分別為0、1、2,這三個編號就分別是系統對鍵盤輸入,屏幕輸出,屏幕報錯的fd 。

這三個是系統默認的,我們將它們歸為:標準輸入(0),標準輸出(1),標準錯誤輸出(2)。很多命令在屏幕端顯示的,都是標準輸出。而一些在命令輸入完成,回車運行過程中,要求我們使用鍵盤輸入的,就是標準輸入。比如 ls 在屏幕列出的文件和目錄序列, cat 命令在運行過程中,我們在鍵盤輸入的單詞。當我們的輸入不符合規范,或者程序運行出現中斷,程序需要將錯誤的內容突出反饋給用戶,在屏幕顯示的就是標準錯誤輸出。

捕獲3 ?? 捕獲4

二、把 I/O 重定向入文件

重定向是指將原先的輸入方向更改到其他的,比如從原先從鍵盤輸入的,我們可以更換到其他方式,原先從從屏幕輸出顯示的,我們輸出到其他位置。

首選的重定向方式是—輸出重定向到文件。具體的操作方法是“完整命令 ? ?? 操作符號 ?? 文件名”。支持的操作符號包括:? >? 把標準輸出重定向到文件; 2>? 把標準錯誤輸出重定向到文件; &>? 把兩種輸出一起重定向到文件 。三種都使用到了 “ > ”這個大于符號,這個符號是比較隨意的符號,每次會將后面跟著的文件內容進行覆蓋,對記錄整體的數據是不好處理的,此時可以使用 set -C? 禁止覆蓋,set +C 恢復覆蓋。在禁止覆蓋的情況下,可以使用 “ >|” 這個符號,同同樣實現覆蓋,而“ >> ”雙大于號是追加的,不是覆蓋,禁止覆蓋是沒有關系的,可以使用“ >> ” , “ 2>> ” ,?“ &>> ”

捕獲5 ? ? ? ? ? ? ? 捕獲6

命令同時具備標準輸出和標準錯誤輸出的,可以使用下面的方法:COMMAND? > /PATH/FILE1? 2> /PATH/FILE2 ,實現標準輸出和錯誤輸出重定向到不同的文件位置。另外這邊需要提及的是:&> ,&>> 并不是對所有版本的Linux系統適用的,若是不能使用,可以在重定向的末尾 加上 2>&1 ,同樣實現標準輸出和錯誤輸出重定向到同一個位置。例如:COMMAND >>/PATH/FIEL? 2>&1 。

當多個程序的一起運行時,可以使用括號括起來,各個程序分號隔開,之后一起重定向到同一個位置。 ( COMMAND 1 ; COMMAND2 ; COMMAND3 ) >FILE.TXT

捕獲7 ? 捕獲8? 捕獲9 ? ? ? ? 以上是將輸出重定向,對應的,我們可以將標準輸入重定向。和標準輸出使用“ > ”類似,標準輸入使用的是“ < ”。cat 命令本身是同時有標準輸出和標準輸入的。標準輸入重定向的用法就是在命令的后面加上“ < FILE ” 。?捕獲1 ?? 之前的f1文件里的信息是123,f2文件里的信息是456。示例中就用f2文件中的內容代替了cat命令的鍵盤輸入。

以上是將標準輸入重定向到文件的方法,還有這種多行重定向的方法,使用的符號是 “ <<終止詞 ” ,位置也是在命令的后面。但是要使用終止詞在符號后面。

捕獲4

三、tr 命令的使用

上面我們使用的都是 cat 這個命令,和 cat 一樣包括標準輸入和標準輸出的命令還有很多,tr 命令就是其中之一,這個命令有字符處理的功能,這里可以著重了解一下。

tr 轉換和刪除字符

tr [OPTION]… SET1 [SET2]

常用的選項:? -c –C –complement:取字符集的補集

-d –delete:刪除所有屬于第一字符集的字符

-s –squeeze-repeats:把連續重復的字符以單獨一個字符表示

-t –truncate-set1:將第一個字符集對應字符轉化為第二字符集 對應的字符

捕獲2

四、使用管道鏈接命令

現實生活中的管道是頭尾銜接,傳遞物體流的設備,在Linux中,將數據作為一種“流”,通過管道連接的命令,就可以將“數據流” 前后傳遞。Linux中的管道在命令中間用“ | ”表示。命令1 | 命令2 |命令3 |….. 管道將命令1的標準輸出發送給命令2的標準輸入,命令2的標準輸出作為命令3的標準輸入,如此反復。標準錯誤輸出是無法通過管道傳遞的。可以利用 2>&1 | 或者 |& 。

捕獲5

當管道傳遞的數據不是標準輸出,而是文件,那么不能作為標準輸入傳遞給下一個命令,則可以使用管道中的 “ – ” 符號代替產生的文件,在管道前,作為輸出的文件,在管道后,作為輸入文件。

tar -cvf ? –? /home ? | tar? -xvf? –

另外,管道后面的命令,參數是多個,而管道前的標準輸出是一串數據流,可以使用 | xargs 命令,將數據流中的空格隔開的數據,分成多個參數,一個個傳遞給管道后的命令處理。

捕獲6

 

 

本文來自投稿,不代表Linux運維部落立場,如若轉載,請注明出處:http://www.www58058.com/89183

(1)
hack王和juhack王和ju
上一篇 2017-12-02
下一篇 2017-12-02

相關推薦

  • python快速入門之數據類型

        Python 是 90 年代初由 Guido Van Rossum 為了打發圣誕節而創建的語言。如今它已是當前最流行的程序語言之一.     Python的關鍵要素有以下幾點:1.基本數據類型;2.對象引用;3.組合數據類型;4.邏輯操作符;5.控制流語句;6.算數操作符…

    Python干貨 2015-12-10
  • bash 循環語句for、while、until

    循環執行 循環執行     定義:將某段代碼有次數或無次數循環執行多次。     構成要素:退出條件和進入條件     循環的三種語句:for、while、until for循環:      &nbs…

    Linux干貨 2016-08-21
  • 一張圖認識開源世界

    開源精神:自由,創新,團結,互助,友愛,積極,進取。在開源環境下也產生了很多優秀的軟件,讓我們通過一幅圖認識一下開源世界里的大咖們! 看圖識物     墻上掛的牛頭:偉大的開源計劃GNU Wiki:http://zh.wikipedia.org/zh-cn/GNU     墻上日歷上的信封標志:經典的linux下的郵件…

    Linux干貨 2015-03-20
  • LV+M

    1、查看分區情況: 2、創建sdc分區,并且更改分區類型為8e  3、同樣步驟2操作,創建sdd分區 4、創建物理卷pv: 5、查看當前系統的物理卷: 6、創建卷組vg: 7、查看當前系統的卷組: 8、創建邏輯卷lv: 9、查看當前系統的邏輯卷: 10、創建文件系統ext4: 11、創建目錄/mnt/lv1并且掛載: 12、擴展物理卷: 13、擴展…

    Linux干貨 2016-09-19
  • sed的用法小結

    sed的用法小結 sed主要用來自動編輯一個或多個文件;簡化對文件的反復操作;編寫轉換程序等sed [OPTION]… ‘script’ [input-file] … OPTION: -n 不輸出模式空間中的內容至屏幕,僅顯示script處理后的結果 -e 多點編輯,eg: ~]# sed -e ‘s@^#[[…

    Linux干貨 2017-08-22
  • 玩轉linux之啟動篇

        想要玩轉linux,首先明白其啟動流程,這里簡單說明一下: CentOS 6啟動流程:    POST –> Boot Sequence(BIOS) –> Boot Loader –> Kernel(ramdisk) –> roo…

    Linux干貨 2016-09-26
欧美性久久久久