哈哈!又到了一週一次的總結時光,每次總結的時候,都能感到時間飛快。雖然是這樣,但是這也是一段讓人享受的時光。以下是我的總結,請各位多多指教。
重定向和管道
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可以追加內容