重定向和管道

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

1240

重定向和管道

1、Linux給程序提供三種I/O設備:

標準輸入(STDIN)-0 默認接受來自鍵盤的輸入(輸入到文件,如tr 'a-z''A-Z' < /etc/issue)

標準輸出(STDOUT)-1 默認輸出到其他終端窗口 (前面是命令,如who >who.out)

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


1240

STDOUT和STDERR可以被重定向到文件:格式:命令 操作符號 文件名

支持的操作符號包括:

> 或 1>(標準輸出)  把STDOUT重定向到文件,將默認或正確的傳到另一個終端

2>(標準錯誤)       把STDERR重定向到文件,可將錯誤信息傳到另一個終端,正確留下

&> (例子ls /err/boot &> /dev/all) 或>&或2>&1(放到末尾 例:ls /err/boot >/app/all 2>&1) 把所有輸出重定向到文件,將所有信息輸出到另一端


1240

ls /etc/passwd /app/passwd &> /dev/null (將不要的內容刪除)

2>&1 將錯誤輸出轉爲正確輸出

1>&2 將正確輸出轉爲錯誤輸出

此外,> 當文件不存在時創建,當文件存在時,文件內容會被覆蓋,可用set -C: 禁止將內容覆蓋已有文件,但可追加(防止覆蓋),相反set +C: 允許覆蓋(可取消覆蓋)

如圖:

1240

>| 文件:強制覆蓋(臨時取消)

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

2>>: 追加重定向錯誤輸出數據流

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

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


1240

():合併多個程序輸出到目的文件

( cal 2007 ; cal 2008 ) > all.txt

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


1240


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中的小寫字符都轉換成大寫字符


1240

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

如圖:

1240

查看是否收到  輸入mail

羣發文件:mail -s "hello" wang


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

什麼是管道?

(使用符號“|”表示)用來連接命令傳給下一條命令(輸出正確的定向,)

命令1 | 命令2 | 命令3 | …

STDERR(標準錯誤)默認不能通過管道轉發,可利用2>&1 或 |& 實現


1240

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

實例:獲取本機的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可以追加內容


1240


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