在了解重定向之前,需要先了解一下標(biāo)準(zhǔn)的輸入輸出,總的來說,所有的數(shù)據(jù)都有來源,也都應(yīng)該都重點(diǎn),默認(rèn)的標(biāo)準(zhǔn)輸入輸出就是終端。
例如:
我們只是輸入 cat 命令,并不指定任何參數(shù),接著我們輸入 hello world,就是打印 helloworld 到終端。
所謂的 I/O 重定向就是通過與終端交互,或是在 shell 腳本里設(shè)置,重新安排從哪里輸入或者輸出到哪里。
使用 <
改變標(biāo)準(zhǔn)輸入
program<file
可將 program 的標(biāo)準(zhǔn)輸入修改為 file
tr
使用 >
改變標(biāo)準(zhǔn)輸出
program>file
可將 program 的標(biāo)準(zhǔn)輸出修改為 file
>
重定向符號(hào)在墓地文件不存在的時(shí)候會(huì)新建一個(gè),如果目的文件存在,目的文件的內(nèi)容會(huì)被覆蓋,原本的數(shù)據(jù)會(huì)丟失。
以 >>
附加到文件
program>>file
可以將 program 的標(biāo)準(zhǔn)輸出追加到 file 的結(jié)尾處。
如同 >
,open or create 文件,但是 >>
會(huì)追加到文件的結(jié)尾而不是覆蓋原文件內(nèi)容。
以 | 符號(hào)建立管道
program1 | program2 可將 program 的標(biāo)準(zhǔn)輸出修改為 program2 的標(biāo)準(zhǔn)輸入。這樣做的好處是執(zhí)行速度較快,不會(huì)產(chǎn)生臨時(shí)文件。一般情況下,越復(fù)雜越強(qiáng)大的管道往往是高效的。
例如:tr -d ‘\r’ dos-file.txt | sort >Linux-file.txt
這條管道會(huì)先刪除輸入文件內(nèi)的回車符號(hào),在完成數(shù)據(jù)的排序之后,將結(jié)果輸出到目的文件。
r 是 translate 的簡(jiǎn)寫,通過這個(gè)單詞,你大概也能猜到它是干什么的了吧!沒錯(cuò),它可以用一個(gè)字符串來替換另一個(gè)字符串,或者可以完全除去一些字符。您也可以用它來除去重復(fù)字符。tr 用來從標(biāo)準(zhǔn)輸入中通過替換或刪除操作進(jìn)行字符轉(zhuǎn)換。tr 主要用于刪除文件中控制字符或進(jìn)行字符轉(zhuǎn)換。
tr [options] cource-char-file replace-char-list
例如:
tr -s "[a-z]"<oops.txt>result.txt
tr -s "[\012]" < plan.txt 或 tr -s ["\n"] < plan.txt
^M
,并代之以換行 tr -s "[\015]" "[\n]" < file 或 tr -s "[\r]" "[\n]" < file
cat a.txt |tr "[a-z]" "[A-Z]" >b.txt
source-char-list
的反義,tr 要轉(zhuǎn)換的字符編程位列在 source-char-list
中的字符,通常與選項(xiàng) -d.-s 配合使用。source-char-list
里所列的字符,將其濃縮成一個(gè)。如同過濾器一般,自標(biāo)準(zhǔn)輸入讀取字符,再將結(jié)果寫到標(biāo)準(zhǔn)輸出,任何輸入字符只要出現(xiàn)在 source-char-list
中,就會(huì)置換成 replace-char-list
里相應(yīng)的字符。
在使用 linux 的工具程序是,不妨將數(shù)據(jù)想想成誰管理的誰,未經(jīng)處理的水,流向凈水廠,經(jīng)過各種過濾器的處理,最后變成適合人類飲用的水??梢园?< 和 > 想象成數(shù)據(jù)的漏斗---- 數(shù)據(jù)會(huì)從大的一頭進(jìn)入,從小的一頭出來。
在構(gòu)造管道的時(shí)候,應(yīng)該試著讓每個(gè)階段的數(shù)據(jù)量變少,也就是說,吧會(huì)讓數(shù)據(jù)變少的命令放在前邊,為后面的命令提供搞笑的執(zhí)行效率。例如,shiyongsort 排序之前,先用 grep 找出相關(guān)的行,這樣可以讓 sort 少做些事。