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