標準I/O和管道
##一,標準輸入和輸出##
程序:指令+數據
讀入數據:Input
輸出數據:Output
打開的文件都有一個fd: file descriptor (文件描述符)
Linux給程序提供三種I/O設備
標準輸入(STDIN)-0 默認接受來自鍵盤的輸入
標準輸出(STDOUT)-1 默認輸出到終端窗口
標準錯誤(STDERR)-2 默認輸出到終端窗口
I/O重定向:改變默認位置
##二,把輸出和錯誤重新定向到文件 ##
STDOUT和STDERR可以被重定向到文件
命令 操作符號 文件名
支持的操作符號包括:
> 把STDOUT重定向到文件
2> 把STDERR重定向到文件
&> 把所有輸出重定向到文件
> 文件內容會被覆蓋
set -C 禁止將內容覆蓋已有文件,但可追加
>| file 強制覆蓋
set +C 允許覆蓋
>> 原有內容基礎上,追加內容
##三,把輸出和錯誤重新定向到文件 ##
2> 覆蓋重定向錯誤輸出數據流
2>> 追加重定向錯誤輸出數據流
標準輸出和錯誤輸出各自定向至不同位置
COMMAND > /path/to/file.out 2> /path/to/error.out
合併標準輸出和錯誤輸出爲同一個數據流進行重定向
&> 覆蓋重定向
&>> 追加重定向
COMMAND > /path/to/file.out 2>&1 (順序很重要)
COMMAND >> /path/to/file.out 2>&1
():合併多個程序的STDOUT
( cal 2007 ; cal 2008 ) > all.txt
#三,tr命令 #
tr 轉換和刪除字符
tr [OPTION]... SET1 [SET2]
選項:
-c –C --complement:取字符集的補集
-d --delete:刪除所有屬於第一字符集的字符
-s --squeeze-repeats:把連續重複的字符以單獨一個字符表示
-t --truncate-set1:將第一個字符集對應字符轉化爲第二字符集對應的字符
[:alnum:]:字母和數字 [:alpha:]:字母 [:cntrl:]:控制(非打印)字符
[:digit:]:數字 [:graph:]:圖形字符 [:lower:]:小寫字母 [:print:]:可打印字符
[:punct:]:標點符號 [:space:]:空白字符 [:upper:]:大寫字母
[:xdigit:]:十六進制字符
四,從文件中導入STDIN
使用 < 來重定向標準輸入
某些命令能夠接受從文件中導入的STDIN
tr ‘a-z’ ‘A-Z’< /etc/issue
該命令會把/etc/issue中的小寫字符都轉換成大寫字符
tr –d abc < /etc/fstab
刪除fstab文件中的所有abc中任意字符
cat > file
mage
wangxiaochun
按ctrl+d離開,可以使用文件來代替鍵盤的輸入
cat < file1 > file2
cat < file1 >> file1
把多行發送給STDIN
使用“<<終止詞”命令從鍵盤把多行重導向給STDIN
直到 終止詞 位置的所有文本都發送給STDIN
有時被稱爲就地文本(heretext)
五,管道
管道(使用符號“|”表示)用來連接命令
命令1 | 命令2 | 命令3 | …
將命令1的STDOUT發送給命令2的STDIN,命令2的STDOUT發送到命令3的STDIN
STDERR默認不能通過管道轉發,可利用2>&1 或 |& 實現
最後一個命令會在當前shell進程的子shell進程中執行
組合多種工具的功能
ls | tr ‘a-z’ ‘A-Z’
less :一頁一頁地查看輸入
ls -l /etc | less
mail: 通過電子郵件發送輸入
echo "test email" | mail -s "test" [email protected]
六,管道中 - 符號
示例
將 /home 裏面的文件打包,但打包的數據不是記錄到文件,而是傳送到 stdout,
經過管道後,將 tar -cvf - /home 傳送給後面的 tar -xvf - , 後面的這個 - 則是取
前一個命令的 stdout, 因此,就不需要使用臨時file了
tar -cvf - /home | tar -xvf -
七,重定向到多個目標(tee)
命令1 | tee [-a ] 文件名 | 命令2
把命令1的STDOUT保存在文件中,做爲命令2的輸入
-a 追加
使用
保存不同階段的輸出
複雜管道的故障排除
同時查看和記錄輸出