初學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 16:08
下一篇 2017-12-02 19:49

相關推薦

  • ldirectord 結合ipvsadm 配置nat,dr模型

    ldirectord 結合ipvsadm 配置nat,dr模型  一、nat模型 1、 drector # wget ftp://172.16.0.1/pub/Sources/7.x86_64/crmsh/ldirectord-3.9.6-0rc1.1.1.x86_64.rpm # yum -y install nginx (同時用于做為sorry…

    Linux干貨 2014-01-03
  • 馬哥網絡教育班21期+第一周博客作業

    1、描述計算機的組成及其功能。   硬件:     CPU(運算器、控制器、一緩存(L1)、二級緩存(L2)):       運算器主要用來進行算數運算以及邏輯運算。       控制器主要是用來協調       一級緩存和二級緩存主要是用…

    Linux干貨 2016-07-12
  • Linux下如何使用sendEmail來發送郵件

    1)什么是sendEmail sendEmail是一個輕量級,命令行的SMTP郵件客戶端(注意,不要跟sendmail混淆了)。如果你需要使用命令行發送郵件,那么sendEmail是非常完美的選擇:使用簡單并且功能強大,從此以后你就愛上了它。 2)安裝sendEmail [root@zabbix ~]# wget http://…

    系統運維 2016-07-29
  • 文件查找與解壓縮

    文件查找 腳本文件名的查詢 which(尋找執行文件) which [-a] command -a :將所有由PATH目錄中可以找到的命令均列出,而不只是第一個被找到的命令名稱 文件名的查找 文件查找:實時查找:遍歷所有文件進行條件匹配;(find)非實時查找:根據索引查找;(whereis、locate) whereis whereis [-bmsu] […

    Linux干貨 2017-04-08
  • 路徑別名的配置

    創建bbs目錄,在里面創建html文件 [root@bluee logs]# cd /www/htdocs [root@bluee htdocs]# ls index.html [root@bluee htdocs]# mkdir bbs [root@bluee htdocs]# vim bbs/index.html [root@bluee htdocs]#…

    Linux干貨 2016-08-05
  • 通過webGUI顯示日志信息

         日志信息通常對于我們維護人員有著極為重要的意義,能夠為我們提供故障排查、運維監控、歷史操作記錄等等很多必要的信息。為了方便此類信息的獲取,我們可以搭建日志服務器,并實現webGUI顯示以便更直觀形象的觀察收集它們。     一、拓撲圖         &nbs…

    Linux干貨 2015-07-15
欧美性久久久久