- 論壇徽章:
- 0
|
9.1 輸入輸出重定向簡介
shell提供重定向一個(gè)命令的輸入和輸出的功能。大多數(shù)的命令的輸出是輸出到終端;比如date,ls,who等等。一些命令從你的鍵盤得到輸入,例子包括mail,write,cat。
在UNIX系統(tǒng)中任何事物都是一個(gè)文件,包括你的終端和鍵盤。輸出重定向
讓你將一個(gè)命令的輸出送到除終端以外的其他的文件中。而輸入重定向讓你從鍵盤以外的文件中得到輸入。
輸出重定向可以用來捕獲一個(gè)命令的輸出,作為記錄日志的需要或?qū)ζ溥M(jìn)行更進(jìn)一步的處理。輸入重定向讓你可以使用一個(gè)編輯器創(chuàng)建一個(gè)文件,然后將這個(gè)文件送到一個(gè)命令,而來代替沒有編輯的能力的交互式的輸入(例如mail命令)。
這一章介紹輸入輸出重定向,然后介紹一些UNIX的過濾器。過濾器是一種特殊的工具,它能進(jìn)一步地處理一個(gè)文件的內(nèi)容。
9.2 標(biāo)準(zhǔn)輸入,標(biāo)準(zhǔn)輸出,和標(biāo)準(zhǔn)錯(cuò)誤
每一次系統(tǒng)啟動(dòng)的時(shí)候,都會(huì)自動(dòng)建立三個(gè)文件,這三個(gè)文件叫做標(biāo)準(zhǔn)輸入,標(biāo)準(zhǔn)輸出,標(biāo)準(zhǔn)錯(cuò)誤。
shell從標(biāo)準(zhǔn)輸入文件得到輸入。這個(gè)文件使用C語言的描述符,0,來打開,通常是你的鍵盤。所以,當(dāng)shell需要輸入的時(shí)候,必須使用鍵盤來輸入數(shù)據(jù)。
一些命令,如mail,write,cat,從標(biāo)準(zhǔn)輸入得到輸入,其方式為輸入命令和參數(shù),回車,然后命令會(huì)等待你提供輸入來進(jìn)行處理。輸入的結(jié)束標(biāo)志是回車和ctrl+d
標(biāo)準(zhǔn)輸出文文件的作用是shell將它的輸出寫到這個(gè)文件。這個(gè)文件使用C語言的描述符號(hào),1來打開,它通常為你的終端。因此,當(dāng)shell產(chǎn)生輸出,這些輸出數(shù)據(jù)通常顯示在你的屏幕上
大多數(shù)的UNIX命令產(chǎn)生標(biāo)準(zhǔn)輸出。這些命令有date,ls,cat,who等等。
標(biāo)準(zhǔn)錯(cuò)誤文件的作用是你的shell會(huì)輸出錯(cuò)誤信息到這個(gè)文件中。這個(gè)文件使用C語言的描述符,2,來打開。同標(biāo)準(zhǔn)錯(cuò)誤文件一樣,標(biāo)準(zhǔn)錯(cuò)誤會(huì)輸出到你的終端。標(biāo)準(zhǔn)錯(cuò)誤可以重新定向輸出到獨(dú)立的標(biāo)準(zhǔn)錯(cuò)誤文件中。
大多數(shù)UNIX系統(tǒng)命令在被不恰當(dāng)調(diào)用的時(shí)候會(huì)產(chǎn)生一個(gè)錯(cuò)誤信息。想要看一個(gè)標(biāo)準(zhǔn)錯(cuò)誤的例子,輸入:cp回車。cp使用信息會(huì)顯示在你的屏幕上,而這些信息實(shí)際上是通過標(biāo)準(zhǔn)錯(cuò)誤流來傳送的
下面將要告訴你如何更改標(biāo)準(zhǔn)輸入,標(biāo)準(zhǔn)輸出,標(biāo)準(zhǔn)錯(cuò)誤的默認(rèn)值,如從一個(gè)文件得到輸入而不是從鍵盤,在其他地方產(chǎn)生輸出(而錯(cuò)誤信息)而不是在終端。
9.3 輸入重定向 - 和>>
所有的可以輸出到標(biāo)準(zhǔn)輸出的命令都能重定向輸出到另外一個(gè)文件。
例子;
建立/覆蓋 ?????????建立/增加
$ date?> date.out? ?????$ ls >>ls.out
$ date > who.log ???????$ who >> who.log
$cat >?cat.out ????????$ ls >> who.log
在此輸入文本
ctrl + d
許多命令在你的屏幕上產(chǎn)生輸出。輸出重定向讓你可以捕獲這些輸出,并且保存為一個(gè)文本文件。
如果在一個(gè)命令的后面有一個(gè)輸出重定向符號(hào)(>),這個(gè)命令產(chǎn)生的標(biāo)準(zhǔn)輸出就會(huì)輸出到這個(gè)文件中,而不是到輸出到屏幕上。如果這個(gè)文件在命令執(zhí)行的時(shí)候并不存在,它會(huì)被自動(dòng)建立。如果這個(gè)文件存在,它的內(nèi)容會(huì)被覆蓋;
如果你想要在文件后添加,而不是覆蓋文件。你可以使用輸出重定向的附加的符號(hào)(>>),如果文件不存在,也會(huì)被創(chuàng)建。在兩個(gè)>符號(hào)之間不能有空格。
注意:shell不能在同一時(shí)刻打開同一個(gè)文件作為輸入重定向和輸出重定向。所以,唯一的限制是輸入文件和輸出文件必須不同。否則你會(huì)丟失文件的原始的內(nèi)容,而輸出重定向也會(huì)失敗。
例子: cat f1 f2 >f1 會(huì)導(dǎo)致文件f1的內(nèi)容丟失。
9.5 錯(cuò)誤重定向-2>和2>>
任何命令,只要能產(chǎn)生錯(cuò)誤信息到標(biāo)準(zhǔn)錯(cuò)誤,都可以重定向錯(cuò)誤信息到另外的文件。
例子:
?$ cp 2> cp.err ???創(chuàng)建/覆蓋
?$ cp 2>> cp.err ??創(chuàng)建/增加
?$
?$ more cp.err
?Usage: cp [-f] [-i] [-p] source_file target_file
???? cp [-f] [-i] [-p] source_file ...target_directory
???? cp [-f] [-i] [-p] -R|-rsource_directory
?Usage: cp [-f] [-i] [-p] source_file target_file
???? cp [-f] [-i] [-p] source_file ...target_directory
???? cp [-f] [-i] [-p] -R|-rsource_directory
如果一個(gè)命令沒有被正確地鍵入,以至shell不能正確地解釋它,就會(huì)產(chǎn)生一個(gè)錯(cuò)誤信息。即使這個(gè)錯(cuò)誤信息是在你的屏幕上顯示,它們實(shí)際上是通過與原始輸出信息不同的文件來傳輸?shù)。錯(cuò)誤信息的傳送是通過錯(cuò)誤流,也稱為標(biāo)準(zhǔn)錯(cuò)誤,來傳輸?shù),?biāo)準(zhǔn)錯(cuò)誤的文件描述符為2。
所以,當(dāng)指明一個(gè)錯(cuò)誤重定向的時(shí)候,你必須指明你想要捕獲是信息流為2的信息。為了重定向標(biāo)準(zhǔn)錯(cuò)誤(2>),在2和>之間不能有空格。同輸出重定向相似的是,如果需要,會(huì)創(chuàng)建一個(gè)文件,或者覆蓋已經(jīng)存在的文件。你能夠使用(2>>)來在一個(gè)已存在的文件末尾添加信息。
從管理員的觀點(diǎn)來看,這種機(jī)制十分有用。經(jīng)常地,你只關(guān)心命令出錯(cuò)或經(jīng)驗(yàn)問題。由于錯(cuò)誤信息同普通的輸出信息分離,你可以很容易捕獲這些錯(cuò)誤信息,和維護(hù)一個(gè)日志文件,其中記錄有你的程序遇到的問題。
9.6 什么是過濾器
※讀取標(biāo)準(zhǔn)輸入和產(chǎn)生標(biāo)準(zhǔn)輸出。
※過濾輸出流或者一個(gè)文件的內(nèi)容
※發(fā)送結(jié)果到屏幕,不改變輸出流或文件的內(nèi)容。
※當(dāng)和輸出重定向相聯(lián)系的時(shí)候處理其它命令的輸出。
例子:vcat,grep,sort,wc
你已經(jīng)了解了如何重定向命令的輸入或輸出。一些命令從標(biāo)準(zhǔn)輸入接收輸入,產(chǎn)生輸出到標(biāo)準(zhǔn)輸出。這些命令就是過濾器。過濾器不會(huì)修改其處理的文件的內(nèi)容。過濾器產(chǎn)生的結(jié)果通常都傳送到終端。
過濾器在處理文件的內(nèi)容時(shí)非常有用。例如計(jì)算行的數(shù)目(wc),按照字母排序(sort),或查找包含有一個(gè)模型的行(grep)。
另外,過濾器可以用來處理任何命令的輸出。由于過濾器能夠操作一個(gè)文件,并且命令的輸出能夠被重定向到一個(gè)文件,這兩種操作聯(lián)合起來能夠?qū)?zhí)行任何命令的輸出進(jìn)行更強(qiáng)大和更靈活的處理。
由于大多數(shù)的
過濾器的輸出是輸出到標(biāo)準(zhǔn)輸出,被過濾的結(jié)果能夠被進(jìn)一步地處理,其方式是通過捕獲被過濾的輸出到一個(gè)文件,并且在這個(gè)被過濾的文件上再執(zhí)行另外的過濾。
9.7 wc - 單詞計(jì)數(shù)(Word Count)
語法:
wc [-lwc] [file...] 計(jì)算一個(gè)文件的行數(shù),單詞數(shù),和字符數(shù)
例子:
$ wc funfile ??funfile作為命令行參數(shù)提供
116 529 3134 funfile
$
$ wc -l funfile
116 funfile
$
$ ls >ls.out
$ wc -w ls.out??計(jì)算在你的目錄下條目的數(shù)量。
72 ls.out
wc命令計(jì)算被提交到標(biāo)準(zhǔn)輸入或是一個(gè)文件中的行數(shù),字?jǐn)?shù),和字符數(shù)。命令的選項(xiàng)有-l,-w,-c。-l選項(xiàng)會(huì)顯示行數(shù),-w選項(xiàng)會(huì)顯示字?jǐn)?shù),-c選項(xiàng)會(huì)顯示字符數(shù)。選項(xiàng)的順序沒有要求,輸出的結(jié)果都是按行,字和字符數(shù)排列。
由于wc從標(biāo)準(zhǔn)輸入接收輸入,并且將其結(jié)果寫到標(biāo)準(zhǔn)輸出,所以wc是一個(gè)過濾器。對(duì)一個(gè)文件執(zhí)行wc不會(huì)影響到文件的內(nèi)容,因?yàn)樗械慕Y(jié)果都被送到屏幕上。
其他例子
?$ wc 回車 ???????????計(jì)算從標(biāo)準(zhǔn)輸入提供的輸入
?ab cde
?fghijkl
?mno pqr stuvwxyz
?ctrl + d
?3 6 32
?$ wc whoson
$ sort whoson ????????以字母排列登錄的用戶名。
$ sort -u -k 1,1 whoson ???排序時(shí)排除雙倍行
sort命令強(qiáng)大而靈活。它能夠被用來以數(shù)字或字母來對(duì)一個(gè)文件的行排序。通過sort也能選擇一行中的一個(gè)特殊的字段。sort也是一個(gè)過濾器,所以,它也能從標(biāo)準(zhǔn)輸入接收數(shù)據(jù),但是它也會(huì)排序作為命令行參數(shù)的文件的內(nèi)容,
sort選項(xiàng) ????sort類型
none ??????辭典(ASCII)
-d ???????目錄(不處理非字母,數(shù)字,或空白的目錄)
-n ???????數(shù)字
-u ???????唯一的(刪除所有的雙倍行)
默認(rèn)得字段之間的分隔符為空白字符-一個(gè)空格或一個(gè)TAB。你可以使用-t
X選項(xiàng)來指定一個(gè)分隔符,其中X代表分隔符。由于冒號(hào)(:)在shell中沒有特殊的意義,于是它通常被用來作為一個(gè)文件中的分隔符。
當(dāng)你確定了字段之間的分隔符是什么,你就可以使用sort 的-K n
選項(xiàng)來通知sort命令,你想要基于那一個(gè)字段來排序,其中n代表sort將要排序的的字段號(hào)。sort命令假定字段號(hào)是由1開始的
sort命令支持多個(gè)選項(xiàng)來執(zhí)行更復(fù)雜的操作。請(qǐng)使用man 來查找其具體用法。
其它例子
$ sort 回車 ???????排序的輸入來自標(biāo)準(zhǔn)輸入
mmmmm
xxxx
aaaa
ctrl + d
aaaa
mmmmm
xxxx
$ sort
本文來自ChinaUnix博客,如果查看原文請(qǐng)點(diǎn):http://blog.chinaunix.net/u2/84425/showart_2069328.html |
|