? ? 哈哈!又到了一周一次的總結(jié)時(shí)光精肃,每次總結(jié)的時(shí)候秤涩,都能感到時(shí)間飛快。雖然是這樣司抱,但是這也是一段讓人享受的時(shí)光筐眷。以下是我的總結(jié),請各位多多指教习柠。
重定向和管道
1诚纸、Linux給程序提供三種I/O設(shè)備:
?標(biāo)準(zhǔn)輸入(STDIN)-0 默認(rèn)接受來自鍵盤的輸入(輸入到文件捉超,如tr 'a-z''A-Z' < /etc/issue)
?標(biāo)準(zhǔn)輸出(STDOUT)-1 默認(rèn)輸出到其他終端窗口 (前面是命令衷敌,如who >who.out)
?標(biāo)準(zhǔn)錯(cuò)誤(STDERR)-2 默認(rèn)輸出到終端窗口
STDOUT和STDERR可以被重定向到文件:格式:命令 操作符號 文件名
支持的操作符號包括:
> 或 1>(標(biāo)準(zhǔn)輸出)? 把STDOUT重定向到文件,將默認(rèn)或正確的傳到另一個(gè)終端
2>(標(biāo)準(zhǔn)錯(cuò)誤)? ? ? 把STDERR重定向到文件堤结,可將錯(cuò)誤信息傳到另一個(gè)終端,正確留下
&> (例子ls /err/boot &> /dev/all) 或>&或2>&1(放到末尾 例:ls /err/boot >/app/all 2>&1) 把所有輸出重定向到文件肉拓,將所有信息輸出到另一端
ls /etc/passwd /app/passwd &> /dev/null (將不要的內(nèi)容刪除)
2>&1 將錯(cuò)誤輸出轉(zhuǎn)為正確輸出
1>&2 將正確輸出轉(zhuǎn)為錯(cuò)誤輸出
此外后频,> 當(dāng)文件不存在時(shí)創(chuàng)建,當(dāng)文件存在時(shí),文件內(nèi)容會被覆蓋卑惜,可用set -C: 禁止將內(nèi)容覆蓋已有文件,但可追加(防止覆蓋)膏执,相反set +C: 允許覆蓋(可取消覆蓋)
如圖:
>| 文件:強(qiáng)制覆蓋(臨時(shí)取消)
>> 原有內(nèi)容基礎(chǔ)上,追加內(nèi)容
2>>: 追加重定向錯(cuò)誤輸出數(shù)據(jù)流
?標(biāo)準(zhǔn)輸出和錯(cuò)誤輸出各自定向至不同位置
COMMAND > /path/to/file.out 2> /path/to/error.out
?():合并多個(gè)程序輸出到目的文件
( cal 2007 ; cal 2008 ) > all.txt
()的比>的優(yōu)先級高露久,>的優(yōu)先級比更米;高
2、tr 轉(zhuǎn)換和刪除字符
?tr [選項(xiàng)]... SET1 [SET2] 例:tr -c ‘a(chǎn)dsc' ‘xrd’? aaadddssscc? xxxrrrddddd
ctrl+c 中斷命令
?選項(xiàng):-c –C --complement:補(bǔ)集毫痕,反向選擇
-d --delete:刪除所有屬于第一字符集的字符-s --squeeze-repeats:把連續(xù)重復(fù)的字符以單獨(dú)一個(gè)字符表示征峦,(把重復(fù)字符替換成一個(gè),多余的刪掉消请,只留一個(gè))
-t --truncate-set1:將第一個(gè)字符集對應(yīng)字符轉(zhuǎn)化為第二字符集(要一一對齊栏笆,沒對應(yīng)的原樣輸出,轉(zhuǎn)換時(shí)臊泰,前后參數(shù)對稱)
-dc 刪除除了某些字符之外的字符-v 垂直輸出例:tr -dc 'a-d'ahdkakjdhk 按ctrl+d才會有結(jié)果adad
對應(yīng)的字符? [:alnum:]:字母和數(shù)字 [:alpha:]:字母 [:cntrl:]:控制(非打域燃印)字符 [:digit:]:數(shù)字 [:graph:]:圖形字符 [:lower:]:小寫字母 [:print:]:可打印字符 [:punct:]:標(biāo)點(diǎn)符號 [:space:]:空白字符() [:upper:]:大寫字母 [:xdigit:]:十六進(jìn)制字符
3、從文件中導(dǎo)入STDIN(標(biāo)準(zhǔn)輸入)
使用<來重定向標(biāo)準(zhǔn)輸入某些命令能夠接受從文件中導(dǎo)入的STDIN? tr ‘a(chǎn)-z’ ‘A-Z’< /etc/issue 或tr ‘a(chǎn)-z’ ‘A-Z’< /etc/issue >f1 或tr ‘a(chǎn)-z’ ‘A-Z ’>f2 < /etc/issue該命令會把/etc/issue中的小寫字符都轉(zhuǎn)換成大寫字符
?tr –d abc < /etc/fstab 刪除fstab文件中的所有abc中任意字符
4缸逃、使用“<<終止詞”命令從鍵盤把多行重導(dǎo)向給STDIN针饥,多數(shù)使用EOF或END?
有時(shí)被稱為就地文本(heretext)mail -s "Please Call(標(biāo)題名)" admin@magedu.com(接收人)
>? 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
群發(fā)文件:mail -s "hello" wang
重頭戲來了,在以后的學(xué)習(xí)中我們常用管道來轉(zhuǎn)發(fā)各種標(biāo)準(zhǔn)輸出
什么是管道需频?
(使用符號“|”表示)用來連接命令傳給下一條命令(輸出正確的定向丁眼,)
命令1 | 命令2 | 命令3 | …
?STDERR(標(biāo)準(zhǔn)錯(cuò)誤)默認(rèn)不能通過管道轉(zhuǎn)發(fā),可利用2>&1 或 |& 實(shí)現(xiàn)
管道可以無限接續(xù)下去直到把文件處理滿意
實(shí)例:獲取本機(jī)的ip地址
管道中 - 符號
?示例:
將 /home 里面的文件打包昭殉,但打包的數(shù)據(jù)不是記錄到文件苞七,而是傳送到 stdout,經(jīng)過管道后饲化,將 tar -cvf - /home 傳送給后面的 tar -xvf - , 后面的這個(gè) - 則是取前一個(gè)命令的stdout, 因此吗伤,就不需要使用臨時(shí)file了
?tar -cvf - /home | tar -xvf -
重定向到多個(gè)目標(biāo)(tee)
Command1 | tee [-a] filename | Command2
可以把Command1的STDOUT保存在文件中吃靠,此外做為Command2的輸入
-a可以追加內(nèi)容