Linux——標準I/O以及管道
目錄
一、什麽是I/O
二、什麽是管道
三、三種I/O設備
四、把I/O輸出錯誤重定向入文件
五、tr
六、從文件中導入STDIN
七、使用管道鏈接命令
八、tee
一、什麽是I/O
I/O(input/output),即輸入/輸出端口。
每個設備都會有一個專用的I/O地址,用來處理自己的輸入輸出信息。CPU與外部設備、存儲器的連接和數據交換都需要通過接口設備來實現,前者被稱為I/O接口,而後者則被稱為存儲器 接口。存儲器通常在CPU的同步控制下工作,接口電路比較簡單;而I/O設備品種繁多,其相應的接口電路也各不相同,因此,習慣上說到接口只是指I/O接口。
二、什麽是管道
管道是Linux支持的最初UnixIPC形式之一
具有以下特點:管道是半雙工的,數據只能向一個方向流動;需要雙方通信時,需要建立起兩個管道;只能用於父子進程或者兄弟進程之間(具有親緣關系的進程);單獨構成一種獨立 的文件系統:管道對於管道兩端的進程而言,就是一個文件,但它不是普通的文件,它不屬於某種文件系統,而是自立門戶,單獨構成一種文件系統,並且只存在與內存中。數據的讀出 和寫入:一個進程向管道中寫的內容被管道另一端的進程讀出。寫入的內容每次都添加在管道緩沖區的末尾,並且每次都是從緩沖區的頭部讀出數據。
三、三種I/O設備
1、標準輸入(STDIN)-0
輸入設備:鍵盤、鼠標、麥克風、攝像頭、掃描儀
2、標準輸出(STDOUT)-1默認輸出到終端窗口
輸出設備:顯示器、打印機、音響、耳機
3、標準錯誤(STDERR)-2默認輸出到終端窗口
四、把I/O輸出錯誤重定向入文件
1、STDOUT和STDERR可以被重定向到文件:
command 操作符號 file
2、支持的操作符號包括:
> 把STDOUT重定向到文件
2> 把STDERR重定向到文件
&> 把所有輸出重定向到文件
set -C: 禁止將內容覆蓋已有文件,但可追加
>| file:強制覆蓋
set +C: 允許覆蓋
4、>> 原有內容基礎上,追加內容
5、2>: 覆蓋重定向錯誤輸出數據流
6、2>>: 追加重定向錯誤輸出數據流
7、 標準輸出和錯誤輸出各自定向至不同位置
COMMAND > /path/to/file.out2> /path/to/error.out
8、合並標準輸出和錯誤輸出為同一個數據流進行重定向
&>覆蓋重定向
&>> 追加重定向
COMMAND > /path/to/file.out2>&1 (順序很重要)
COMMAND >> /path/to/file.out2>&1
9、():合並多個程序的STDOUT
(cal2007;cal2008)> all.txt
五、tr
1、tr轉換和刪除字符
2、tr[OPTION]... SET1 [SET2]
3、選項:
-c–C --complement:取字符集的補集
-d--delete:刪除所有屬於第一字符集的字符
-s--squeeze-repeats:把連續重復的字符以單獨一個字符表示
-t--truncate-set1:將第一個字符集對應字符轉化為第二字符集對應的字符
4、通配符
[:alnum:]:字母和數字
[:alpha:]:字母
[:cntrl:]:控制(非打印)字符
[:digit:]:數字
[:graph:]:圖形字符
[:lower:]:小寫字母
[:print:]:可打印字符
[:punct:]:標點符號
[:space:]:空白字符
[:upper:]:大寫字母
[:xdigit:]:十六進制字符
六、從文件中STDIN
1、使用<來重定向標準輸入
2、某些命令能夠接受從文件中導入的STDIN
tr‘a-z’‘A-Z’</etc/issue
該命令會把/etc/issue中的小寫字符都轉換成寫寫字符
3、 tr–d abc< /etc/fstab刪除fstab文件中的所有abc中任意字符
4、cat > file
mage
wangxiaochun
按ctrl+d離開,可以使用文件來代替鍵盤的輸入
5、cat > filea< fileb
六、使用管道鏈接命令
1、管道(使用符號“|”表示)用來連接命令
命令1 | 命令2 | 命令3 | …
將命令1的STDOUT發送給命令2的STDIN,命令2的STDOUT發送到命令3的STDIN
STDERR默認不能通過管道轉發,可利用2>&1 或|& 實現
最後一個命令會在當前shell進程的子shell進程中執行用來
組合多種工具的功能
ls | tr 'a-z' 'A-Z'
2、less :一頁一頁地查看輸入
ls-l/etc|less
3、mail:通過電子郵件發送輸入
echo"testemail"|mail-s "test"[email protected]
4、lpr:把輸入發送給打印機
echo"testprint"|lpr-Pprinter_name
5、- 符號
示例:
將/home 裏面的文件打包,但打包的數據不是記錄到文件,而是傳送到stdout,經過管道後,將tar -cvf-/home 傳送給後面的tar -xvf-, 後面的這個-則是取前一個命令的stdout,因 此,就不需要使用臨時file了
tar -cvf-/home | tar -xvf-
七、重定向到多個目標(tee)
1、命令1 | tee[-a ] 文件名| 命令2
把命令1的STDOUT保存在文件中,做為命令2的輸入
-a 追加
2、使用:
保存不同階段的輸出
復雜管道的故障排除
同時查看和記錄輸出
Linux——標準I/O以及管道