天天看點

重定向和管道

   哈哈!又到了一周一次的總結時光,每次總結的時候,都能感到時間飛快。雖然是這樣,但是這也是一段讓人享受的時光。以下是我的總結,請各位多多指教。

重定向和管道

重定向和管道

1、Linux給程式提供三種I/O裝置:

标準輸入(STDIN)-0 預設接受來自鍵盤的輸入(輸入到檔案,如tr 'a-z''A-Z' < /etc/issue)

标準輸出(STDOUT)-1 預設輸出到其他終端視窗 (前面是指令,如who >who.out)

标準錯誤(STDERR)-2 預設輸出到終端視窗

重定向和管道

STDOUT和STDERR可以被重定向到檔案:格式:指令 操作符号 檔案名

支援的操作符号包括:

> 或 1>(标準輸出)  把STDOUT重定向到檔案,将預設或正确的傳到另一個終端

2>(标準錯誤)       把STDERR重定向到檔案,可将錯誤資訊傳到另一個終端,正确留下

&> (例子ls /err/boot &> /dev/all) 或>&或2>&1(放到末尾 例:ls /err/boot >/app/all 2>&1) 把所有輸出重定向到檔案,将所有資訊輸出到另一端

重定向和管道

ls /etc/passwd /app/passwd &> /dev/null (将不要的内容删除)

2>&1 将錯誤輸出轉為正确輸出

1>&2 将正确輸出轉為錯誤輸出

此外,> 當檔案不存在時建立,當檔案存在時,檔案内容會被覆寫,可用set -C: 禁止将内容覆寫已有檔案,但可追加(防止覆寫),相反set +C: 允許覆寫(可取消覆寫)

如圖:

重定向和管道

>| 檔案:強制覆寫(臨時取消)

>> 原有内容基礎上,追加内容

2>>: 追加重定向錯誤輸出資料流

标準輸出和錯誤輸出各自定向至不同位置

COMMAND > /path/to/file.out 2> /path/to/error.out

重定向和管道

():合并多個程式輸出到目的檔案

( cal 2007 ; cal 2008 ) > all.txt

()的比>的優先級高,>的優先級比;高

重定向和管道

2、tr 轉換和删除字元

tr [選項]... SET1 [SET2] 例:tr -c ‘adsc' ‘xrd’   aaadddssscc   xxxrrrddddd

ctrl+c 中斷指令

選項:-c –C --complement:補集,反向選擇

-d --delete:删除所有屬于第一字元集的字元-s --squeeze-repeats:把連續重複的字元以單獨一個字元表示,(把重複字元替換成一個,多餘的删掉,隻留一個)

-t --truncate-set1:将第一個字元集對應字元轉化為第二字元集(要一一對齊,沒對應的原樣輸出,轉換時,前後參數對稱)

-dc 删除除了某些字元之外的字元-v 垂直輸出例:tr -dc 'a-d'ahdkakjdhk 按ctrl+d才會有結果adad

對應的字元 [:alnum:]:字母和數字 [:alpha:]:字母 [:cntrl:]:控制(非列印)字元 [:digit:]:數字 [:graph:]:圖形字元 [:lower:]:小寫字母 [:print:]:可列印字元 [:punct:]:标點符号 [:space:]:空白字元() [:upper:]:大寫字母 [:xdigit:]:十六進制字元

3、從檔案中導入STDIN(标準輸入)

使用<來重定向标準輸入某些指令能夠接受從檔案中導入的STDIN   tr ‘a-z’ ‘A-Z’< /etc/issue 或tr ‘a-z’ ‘A-Z’< /etc/issue >f1 或tr ‘a-z’ ‘A-Z ’>f2 < /etc/issue該指令會把/etc/issue中的小寫字元都轉換成大寫字元

重定向和管道

tr –d abc < /etc/fstab 删除fstab檔案中的所有abc中任意字元

4、使用“<<終止詞”指令從鍵盤把多行重導向給STDIN,多數使用EOF或END

有時被稱為就地文本(heretext)mail -s "Please Call(标題名)" [email protected](接收人)

>  Please give me a call when you get in. We may need

>  to do some maintenance on server1.

>  Details when you're on-site

>  Zhang

>  END

重定向和管道

檢視是否收到  輸入mail

群發檔案:mail -s "hello" wang

重頭戲來了,在以後的學習中我們常用管道來轉發各種标準輸出

什麼是管道?

(使用符号“|”表示)用來連接配接指令傳給下一條指令(輸出正确的定向,)

指令1 | 指令2 | 指令3 | …

STDERR(标準錯誤)預設不能通過管道轉發,可利用2>&1 或 |& 實作

重定向和管道

管道可以無限接續下去直到把檔案處理滿意

執行個體:擷取本機的ip位址

管道中 - 符号

示例:

将 /home 裡面的檔案打包,但打包的資料不是記錄到檔案,而是傳送到 stdout,經過管道後,将 tar -cvf - /home 傳送給後面的 tar -xvf - , 後面的這個 - 則是取前一個指令的stdout, 是以,就不需要使用臨時file了

tar -cvf - /home | tar -xvf -

重定向到多個目标(tee)

Command1 | tee [-a] filename | Command2

可以把Command1的STDOUT儲存在檔案中,此外做為Command2的輸入

-a可以追加内容

重定向和管道

本文轉自 優果馥思 51CTO部落格,原文連結:http://blog.51cto.com/youguofusi/1965894