重定向

Linux shell接收或發(fā)送徐磊和字符串流行是的輸入或輸出,不管實(shí)際的字符串流進(jìn)入或來自哪個(gè)文件、鍵盤、顯示窗口等設(shè)備,都使用文件I/O技術(shù)來訪問流。Linux shell使用3種標(biāo)準(zhǔn)的I/O流,每種流都與一個(gè)文件描述符相關(guān):
1.stdout是標(biāo)準(zhǔn)輸出流,顯示來自命令的輸出,文件描述符為1
2.stderr是標(biāo)準(zhǔn)錯(cuò)誤流,顯示來自命令的錯(cuò)誤輸出,文件描述符為2
3.stdin是標(biāo)準(zhǔn)輸入流,為命令提供輸入,文件描述符為0

重定向輸出:
--------------------------------------------------------------------------------------------------
>            輸出重定向到一個(gè)文件或設(shè)備,覆蓋原來的文件
>!           輸出重定向到一個(gè)文件或設(shè)備,強(qiáng)制覆蓋原來的文件
>>          輸出重定向到一個(gè)文件或設(shè)備,追加原來的文件
n>          標(biāo)準(zhǔn)輸出/標(biāo)準(zhǔn)錯(cuò)誤重定向到一個(gè)文件或者設(shè)備,覆蓋原來文件(1為默認(rèn))
n>>        標(biāo)準(zhǔn)輸出/標(biāo)準(zhǔn)錯(cuò)誤重定向到一個(gè)文件或者設(shè)備,追加原來的文件(1為默認(rèn))
m>&n     標(biāo)準(zhǔn)輸出/標(biāo)準(zhǔn)錯(cuò)誤重定向到標(biāo)準(zhǔn)錯(cuò)誤輸出/標(biāo)準(zhǔn)錯(cuò)誤
m>>&n
&>         將標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤重定向到同一個(gè)文件中
&>>
--------------------------------------------------------------------------------------------------
注意:
1.以下兩個(gè)指令:
command 2>&1 1>output.txt
command 1>output.txt 2>&1
這個(gè)指令是不一樣的,第一種情況中,stderr被重定向到stdout的當(dāng)前位置,然后再將stdout重定向到output.txt,但1>output.txt只影響stdout,不影響stderr。第二種情況中,stderr被重定向到stdout的當(dāng)前位置,即output.txt中
2.可以將選擇的流重定向到空文件/dev/null,這樣相當(dāng)于完全忽略所選的標(biāo)準(zhǔn)流。使用cat命令顯示/dev/null是空的。
3.文件重定向的命令行內(nèi)容是從左到右估算的。以下面的兩個(gè)命令為例:
sort 0<students 1>students.sorted 2>sort.error
如果上述命令中因?yàn)閟tudents文件不存在而無法啟動(dòng),那么1>students.sorted 2>sort.error這一段便無法執(zhí)行,所以錯(cuò)誤消息依然被發(fā)送到顯示屏,而不是保存到文件sort.error中。
sort 2>sort.error 0<students 1>students.sorted
上述命令解決了這個(gè)問題,如果sort命令不能啟動(dòng)是因?yàn)閟tudents文件不存在,錯(cuò)誤消息會(huì)被保留到文件sort.error中,因?yàn)閟hell在確定文件students不存在之前就已經(jīng)處理了錯(cuò)誤輸出重定向。

重定向輸入:
-------------------------------------------------------------
<        輸入重定向到一個(gè)程序,如tr ' ' '\n' < text
0<      標(biāo)準(zhǔn)輸入重定向
-------------------------------------------------------------
注意:
1.輸入重定向與管道是可以互換的,例如cat file | tr ' ' '\t'使用管道命令將cat指令的標(biāo)準(zhǔn)輸出果作為tr指令的標(biāo)準(zhǔn)輸入,可以寫成tr ' ' '\t' < file。
2.shell存在here-document的概念,這是另一種輸入重定向的形式,它將<<和一個(gè)單詞結(jié)合構(gòu)成一個(gè)標(biāo)記,用來表示輸入端結(jié)束符,例如:
sort -n << END
該指令接收來自標(biāo)準(zhǔn)輸入端的字符,直到END為止,然后sort排序。當(dāng)然也可以使用sort -n以及CTRL+D來代替。

管道

1.在兩個(gè)命令之間使用管道|操作符將前一個(gè)命令的stdout指向第二個(gè)命令的stdin,可以通過添加更多的命令和管道操作符來構(gòu)造更長的管道線。使用管道操作符后,可以使用連字符-取代文件名作為一個(gè)參數(shù),用于表述輸入來自stdin而不是文件。
2.需要注意,管道線僅將stdout導(dǎo)向stdin,不能使用2|這樣的形式單獨(dú)到處stderr,但是可以先將stderr重定向到stdout,然后使用管道命令,例如ls y* x* z* 2>&1 | sort。
3.管道不涉及到中間文件,第一個(gè)命令的stdout沒有寫到一個(gè)文件中,然后再由第二個(gè)命令讀?。ㄏ喈?dāng)于重定向的寫法),例如bunzip2 -c somefile.tar.bz2 | tar -xvf -命令。

與管道相關(guān)的一些指令

cut -d "分割字符" [-cf] fields file
         //使用某分隔符分割并列出要求的區(qū)域
-d    后面接的是分割字符,默認(rèn)是空格符
-c    后面接的是第幾個(gè)字符
-f    后面接的是第幾個(gè)區(qū)塊
例子:
cat /etc/passwd | cut -d ":" -f 1
將passwd文件中每一行里的":"用作分隔符,列出第一個(gè)區(qū)塊。
last | cut -d " " -f 1
以空格作為分隔,并列出第一個(gè)區(qū)塊。

sort [-t 分隔符] [(+起始)(-結(jié)束)] [-nru] file       //排序
-t     分隔符,用來隔開不同的區(qū)塊,默認(rèn)是TAB
-n    使用純數(shù)字排序(默認(rèn)以字母方式排序)
-r    反向排序
-u    相同出現(xiàn)的一行,只列出一次
+start -end    由第start區(qū)塊排序到第end區(qū)塊

wc [-lmw] file
-l      計(jì)算有多少行
-m    計(jì)算有多少字符
-w    計(jì)算有多少字
wc用于統(tǒng)計(jì),例如要知道目前帳號(hào)文件里有多少帳號(hào),就是用wc -l,因?yàn)?etc/passwd里一行代表一個(gè)用戶,即:cat /etc/passwd | wc -l。

uniq [-cdu] inputfile [outputfile]          //默認(rèn)用來顯示所有的行一次
-c    用于計(jì)算每行出現(xiàn)的次數(shù)
-d    只打印不重復(fù)的行
-u    只打印重復(fù)的行
例如:
last | cut -d " " -f 1 | sort | uniq

tee file
tee命令將數(shù)據(jù)同時(shí)顯示在屏幕上和文件中,使用方式如下:
last | tee file | cut -d " " -f 1
last的輸出數(shù)據(jù)傳入file中,也會(huì)同時(shí)傳給stdout。

tr [-ds] SET1 [SET2]                //從標(biāo)準(zhǔn)輸入中翻譯、刪除字符串,并寫到標(biāo)準(zhǔn)輸出中
-d    刪除SET1這個(gè)字符串
-s    對(duì)SET1出現(xiàn)的字符,當(dāng)連續(xù)出現(xiàn)時(shí)僅打印一次
例如:
cat /etc/passwd | tr -d :
這個(gè)命令會(huì)刪除':'這個(gè)符號(hào)并顯示輸出。
last | tr '[a-z]' '[A-Z]'
這個(gè)命令將小寫改成大寫,取代原有的字符。

split [-bl num] 輸入文件 輸出文件前導(dǎo)字符
-b    以文件size來分
-l    以行數(shù)來分
該指令將某文件內(nèi)容分割成幾個(gè)子文件,子文件名字為前導(dǎo)字符+aa、ab、ac等,使用-l指定每個(gè)文件的行數(shù),使用-b指定每個(gè)文件的大小。
例子:
split -l 5 /etc/passwd test    //產(chǎn)生testaa、testab等文件。