重定向和管道

2021-10-23 01:20:06 字數 3777 閱讀 9873

linux給程式提供三種i/o裝置:

標準輸入( stdin)-0 預設接受來自鍵盤的輸入;

標準輸出( stdout)-1 預設輸出到終端視窗;

標準錯誤( stderr)-2 預設輸出到終端視窗;

由於linux提供給我們的三種標準io裝置並不能滿足所有的情況,於是有了io重定向,將檔案輸出流定向至指定的檔案、終端;當前也可以接收來自於不同的檔案、終端的輸入。

2、輸出重定向

包括標準輸出重定向和標準錯誤輸出重定向。

stdout和stderr可以被重定向到檔案:

語法:

命令 操作符號 檔名

支援的操作符號:

> 把stdout重定向到檔案;

2> 把stderr重定向到檔案;

&> 把所有輸出重定向到檔案;

2.1、輸出重定向分類:

:檔案內容會被覆蓋;

set –c 禁止將內容覆蓋已有檔案,但可追加》| ;file 強制覆蓋set +c 允許覆蓋;

:原有內容基礎上,追加內容;

2>:覆蓋重定向錯誤輸出資料流;

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

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

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

2.3、合併標準輸出和錯誤輸出為同乙個資料流進行重定向

&> :覆蓋重定向

&>> :追加重定向

,2>&1 和 >> 2>&1:

command > /path/to/file.out 2>&1 (順序很重要)

command >> /path/to/file.out 2>&1

():合併多個程式的stdout

( cal 2007 ; cal 2008 ) > all.txt

3、tr命令

tr:轉換和刪除字元;

tr [option]... set1 [set2];

選項:

-c –c --complement:取字符集的補集;    

-d --delete:刪除所有屬於第一字符集的字元;

-s --squeeze-repeats:把連續重複的字元以單獨乙個字元表示;

-t --truncate-set1:將第乙個字符集對應字元轉化為第二字符集對應的字元;

tr命令支援的萬用字元:

[:alnum:]:字母和數字;    

[:alpha:]:字母;

[:cntrl:]:控制(非列印)字元 ;

[:digit:]:數字 ;

[:graph:]:圖形字元;

[:lower:]:小寫字母 ;

[:print:]:可列印字元;

[:punct:]:標點符號;

[:space:]:空白字元;

[:upper:]:大寫字母;

[:xdigit:]:十六進製制字元;

3.1、從檔案中匯入stdin

(1)使用《來重定向標準輸入;可以是檔案可以是鍵盤輸入;

(2)某些命令能夠接受來自於檔案匯入的stdin;如cat /etc/passwd相當於 #cat < /etc/passwd;對於不能接受來自檔案的輸入重定向時,需要使用《指定輸入重定向。

tr 『a-z』 『a-z』< /etc/issue:該命令會把/etc/issue中的小寫字元都轉換成寫寫字元

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

(3)預設接受來自鍵盤的標準輸入:

cat > file

abcdef

按ctrl+d離開,可以使用檔案來代替鍵盤的輸入

(4)接受來自鍵盤的標準輸入,並輸出重定向到乙個檔案中:

cat > filea < fileb

3.2、把多行傳送給stdin;

使用「 《終止詞」命令從鍵盤把多行重導向給stdin,直到 "終止詞" 位置的所有文字都傳送給stdin;有時被稱為就地文字( heretext)。

mail 命令就是預設接收標準輸入的;

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

4、管道

輸入輸出重定向功能固然強大,但是無法解決將乙個命令的輸入結果直接定向到乙個命令中,作為乙個命令的執行結果,而是只能將輸入結果定向到當前終端或者是指定檔案中;於是就有了管道。
格式:

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

說明:管道(使用符號「 |」表示)用來連線命令:
作用:

將命令1的stdout傳送給命令2的stdin,命令2的stdout傳送到命令3的stdin;

stderr預設不能通過管道**,可利用2>&1 或 |& 實現;

最後乙個命令會在當前shell程序的子shell程序中執行;

用來組合多種工具的功能;ls | tr 'a-z' 'a-z'

[root@centos7x ~]#ls /a |& tr 『a-z』 『a-z』

ls: cannot access /a: no such file or directory

[root@centos7x ~]#ls /a | tr 『a-z』 『a-z』

ls: cannot access /a: no such file or directory

4.1、管道中常用的檢視命令:

less :一頁一頁地檢視輸入,看完即退出;預設接受標準鍵盤輸入。但是在管道中使用less的時候,會導致無法使用"b"鍵完成回翻。
ls -l /etc | less

mail: 通過電子郵件傳送輸入;預設接收標準鍵盤輸入;
echo 「test email」 | mail -s 「test」 [email protected]

lpr:把輸入傳送給印表機:
echo 「test print」 | lpr -p printer_name

4.2、管道中 - 符號

示例:將 /home 裡面的檔案打包,但打包的資料不是記錄到檔案,而是傳送到 stdout, 經過管道後,將 tar -cvf - /home 傳送給後面的 tar -xvf - , 後面的這個 - 則是取前乙個命令的stdout, 因此,就不需要使用臨時file了。

tar -cvf - /home | tar -xvf -

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

格式:

命令1 | tee [-a ] 檔名 | 命令2
解釋:

把命令1的stdout儲存在檔案中,做為命令2的輸入;-a 追加。
功能:

儲存不同階段的輸出;

複雜管道的故障排除;

同時檢視和記錄輸出;

演示:

重定向和管道

重定向和管道 第 3 章 命令列簡介 程序 包括圖形應用程式,但不包括絕大多數守護程式 至少使用三個檔案描述符 標準輸入 標準輸出和標準錯誤輸出 它們相應的序號是 0 1 和 2。一般來說,這三個描述符與該程序啟動的終端相關聯,其中輸入為鍵盤。重定向和管道的目的是重定向這些描述符。本節中的例項將幫助...

管道和重定向

重定向輸出 ls l 1.txt 這條命令,把本應該在標準輸出 檔案描述符為1 裝置上顯示的內容重定向到了 1.txt 檔案中,而在標準輸出中不會有任務顯示 如果當前目錄下,1.txt檔案存在,則新內容會覆蓋1.txt裡的所有內容.不存在則會在當前目錄中新建乙個1.txt ls l 2.txt 這條...

管道和重定向

重定向 將標準輸出重定向到檔案 覆蓋 如 echo wudi outfile 將標準輸出重定向到檔案 追加到後面 如 echo jiaying outfile 2 將標準錯誤重定向到檔案 覆蓋 2 1 將標準輸出和標準錯誤結合 重定向標準輸入,如 grep root etc passwd 在pass...