IO重定向及管道

tr围详,tee

程序的IO

簡(jiǎn)單的說(shuō)程序由指令(命令)和數(shù)據(jù)(操作對(duì)象)組成襟铭,在linux上一切皆文件,程序操作對(duì)象(數(shù)據(jù))來(lái)自系統(tǒng)上的各種文件即程序的輸入短曾,由程序處理之后輸出的結(jié)果即程序的輸出

  • 數(shù)據(jù)的輸入與輸出
    • 可用于輸入的設(shè)備:文件寒砖,鍵盤(pán)設(shè)備、文件系統(tǒng)上的常見(jiàn)文件嫉拐、網(wǎng)卡等
    • 可用于輸出的設(shè)備:文件哩都,顯示器、文件系統(tǒng)上常見(jiàn)的文件婉徘、網(wǎng)卡等
  • 程序數(shù)據(jù)流的三種狀態(tài)或形式
    • 輸入的數(shù)據(jù)流:標(biāo)準(zhǔn)輸入(stdin)漠嵌,默認(rèn)為從鍵盤(pán)
    • 輸出的數(shù)據(jù)流:標(biāo)準(zhǔn)輸出(stdout),默認(rèn)輸出到顯示器
      命令執(zhí)行所回傳的正確的信息
    • 錯(cuò)誤輸出數(shù)據(jù)流:錯(cuò)誤輸出(stderr)盖呼,默認(rèn)輸出到顯示器
      命令執(zhí)行失敗后儒鹿,所回傳的錯(cuò)誤信息
  • fd:file descriptor,文件描述符
    簡(jiǎn)單說(shuō)几晤,它是一個(gè)索引值约炎,指向 內(nèi)核為每一個(gè)進(jìn)程所維護(hù)的該進(jìn)程打開(kāi)文件的記錄表;
    本人目前的理解只有這么多,后續(xù)學(xué)習(xí)中在進(jìn)行補(bǔ)充文件描述符的相關(guān)知識(shí)圾浅。
    IO重定向會(huì)圍繞描述符來(lái)展開(kāi)掠手,列舉以下三種文件描述符
    • 標(biāo)準(zhǔn)輸入:0
    • 標(biāo)準(zhǔn)輸出:1
    • 錯(cuò)誤輸出:2
IO重定向

不使用系統(tǒng)默認(rèn)的標(biāo)準(zhǔn)輸入輸出,而是重新指定,即輸入重定向,輸出重定向,錯(cuò)誤輸出重定向,雙重輸出重定向(一次單獨(dú)地送到不同的地方)。IO重定向其實(shí)就是讓已創(chuàng)建的FD指向其它的文件(修改其鏈接的文件)狸捕。輸入輸出數(shù)據(jù)流的位置用FD標(biāo)識(shí)

輸出重定向
  • 標(biāo)準(zhǔn)輸出重定向
    • 喷鸽,即1>
      特性:覆蓋輸出
      * >>,即1>>
      特性:追加輸出
      * # set -C
      禁止覆蓋輸出重定向至已存在的文件灸拍,只對(duì)當(dāng)前shell進(jìn)程生效
      此時(shí)可使用強(qiáng)制覆蓋輸出:>|
      * # set +C
      關(guān)閉上述特性

  • 錯(cuò)誤輸出重定向
    • 2>
      特性:覆蓋追加輸出
    • 2>>
      特性:追加錯(cuò)誤輸出
  • 合并標(biāo)準(zhǔn)輸出流和錯(cuò)誤輸出流
    • &>做祝,覆蓋合并
    • &>>,覆蓋追加
    • COMMAND > /path/to/somefile 2>&1鸡岗,前面>是覆蓋后面>就是覆蓋
    • COMMAND >> /path/to/somefile 2>&1混槐,前面>>是追加后邊的>就是追加
  • 特殊設(shè)備:/dev/null
    將輸出的數(shù)據(jù)丟到此目錄,所有的數(shù)據(jù)都會(huì)無(wú)聲無(wú)息被丟棄纤房。根據(jù)命令的執(zhí)行結(jié)果可以判斷目錄及文件的存在與否及內(nèi)容有無(wú)
輸入重定向

<纵隔,會(huì)經(jīng)常和tr命令一起使用。介紹下tr命令的用法

  • image.png
  • Here Document :<<炮姨,此處創(chuàng)建文檔

    • cat << EOF
    • cat > /PATH/TO/SOMEFILE << EOF
管道

鏈接程序捌刮,實(shí)現(xiàn)前一個(gè)命令的輸出直接定向到后一個(gè)程序并當(dāng)作輸入數(shù)據(jù)流(Linux的哲學(xué)思想)
只會(huì)將最后一個(gè)命令的執(zhí)行結(jié)果,作為標(biāo)準(zhǔn)輸出舒岸,前面的命令的輸出都會(huì)作為下一個(gè)命令的輸入绅作,不會(huì)在屏幕上顯示了。
COMMAND1 | COMMAND2 | COMMAND3 |……
管道符與tee命令結(jié)合使用蛾派,將前一個(gè)命令的標(biāo)準(zhǔn)輸出保存一份俄认,然后繼續(xù)通過(guò)管道符送到下一個(gè)命令,實(shí)現(xiàn)命令分方向發(fā)送洪乍。tee介紹如下:

  • image.png
相關(guān)演示

[root@localhost mytest]# touch fedora   \\創(chuàng)建一個(gè)空文件
[root@localhost mytest]# ll
總用量 0
-rw-r--r--. 1 root root 0 8月 13 22:50 fedora
[root@localhost mytest]# echo diyihang > fedora   \\將echo回顯的內(nèi)容重定向到fedora
[root@localhost mytest]# cat fedora   
diyihang
[root@localhost mytest]# echo dierhang > fedora   \\覆蓋重定向眯杏,第一次的內(nèi)容被覆蓋
[root@localhost mytest]# cat fedora
dierhang
[root@localhost mytest]# echo desanhang >> fedora   \\追加重定向
[root@localhost mytest]# cat fedora
dierhang
desanhang
[root@localhost mytest]# set -C   \\禁止重定向覆蓋已存在的文件,即使文件為空的壳澳。
[root@localhost mytest]# echo disihang > fedora   
-bash: fedora: 無(wú)法覆蓋已存在的文件
[root@localhost mytest]# echo disihang >> fedora   \\只可以追加
[root@localhost mytest]# cat fedora
dierhang
desanhang
disihang
[root@localhost mytest]# echo dierhang >| fedora   \\強(qiáng)制覆蓋
[root@localhost mytest]# cat fedora
dierhang
[root@localhost mytest]# set +C   \\取消進(jìn)制覆蓋重定向
[root@localhost mytest]# echo diyihang > fedora
[root@localhost mytest]# cat fedora
diyihang
[root@localhost mytest]# > fedora
[root@localhost mytest]# cat fedora
[root@localhost mytest]# echo dierhang > suse   \\重定向的文件不存在岂贩,會(huì)自動(dòng)創(chuàng)建此文件
[root@localhost mytest]# ll
總用量 8
-rw-r--r--. 1 root root 9 8月 13 22:54 fedora
-rw-r--r--. 1 root root 9 8月 13 22:54 suse
[root@localhost mytest]# cat suse
dierhang
[root@localhost mytest]# > centos   \\重定向到新文件,什么也沒(méi)有巷波,即創(chuàng)建空文件萎津,相當(dāng)于touch
[root@localhost mytest]# ll
總用量 8
-rw-r--r--. 1 root root 0 8月 13 22:54 centos
-rw-r--r--. 1 root root 9 8月 13 22:54 fedora
-rw-r--r--. 1 root root 9 8月 13 22:54 suse
[root@localhost mytest]# ll centos1
ls: 無(wú)法訪問(wèn)centos1: 沒(méi)有那個(gè)文件或目錄
[root@localhost mytest]# ll centos1 2> ubuntu
[root@localhost mytest]# cat ubuntu
ls: 無(wú)法訪問(wèn)centos1: 沒(méi)有那個(gè)文件或目錄
[root@localhost mytest]# ll centos2 2>> ubuntu
[root@localhost mytest]# cat ubuntu
ls: 無(wú)法訪問(wèn)centos1: 沒(méi)有那個(gè)文件或目錄
ls: 無(wú)法訪問(wèn)centos2: 沒(méi)有那個(gè)文件或目錄
[root@localhost mytest]# cat fedora
diyihang
[root@localhost mytest]# cat fedora &> suse   \\合并重定向
[root@localhost mytest]# cat suse
diyihang
[root@localhost mytest]# cat fedora1 &>> suse
[root@localhost mytest]# cat suse
diyihang
cat: fedora1: 沒(méi)有那個(gè)文件或目錄
[root@localhost mytest]# cat fedora1
cat: fedora1: 沒(méi)有那個(gè)文件或目錄
[root@localhost mytest]# cat fedora1 > suse 2>&1
[root@localhost mytest]# cat suse
cat: fedora1: 沒(méi)有那個(gè)文件或目錄
[root@localhost mytest]# cat fedora > suse 2>&1
[root@localhost mytest]# cat suse
diyihang
[root@localhost mytest]# cat fedora1 >> suse 2>&1
[root@localhost mytest]# cat suse
diyihang
cat: fedora1: 沒(méi)有那個(gè)文件或目錄
[root@localhost mytest]# ls /tmp/mytest/
centos fedora suse ubuntu
[root@localhost mytest]# ls /tmp/mytest1 &> /dev/null   \\可以通過(guò)合并重定向到null文件,根據(jù)命令執(zhí)行的狀態(tài)值抹镊,判斷是否有該目錄锉屈。
[root@localhost mytest]# echo $?   \\返回值為2,命令執(zhí)行失敗垮耳,所以沒(méi)有mytest1目錄
2
[root@localhost mytest]# ls /tmp/mytest &> /dev/null
[root@localhost mytest]# echo $?   \\返回值為0颈渊,命令執(zhí)行成功,所以有mytest目錄
0
[root@localhost mytest]# cat fedora
diyihang
dierhang
disanhang
disiheng
5diwuhang6
di6hang
[root@localhost mytest]# tr [a-z] [A-Z] < fedora   \\通過(guò)符號(hào)"<"將文件的內(nèi)容送給命令tr處理,即將所有小寫(xiě)字母儡炼,變?yōu)榇髮?xiě)妓湘。"<"后邊為已經(jīng)存在的文件
DIYIHANG
DIERHANG
DISANHANG
DISIHENG
5DIWUHANG6
DI6HANG
[root@localhost mytest]# cat fedora
diyihang
dierhang
disanhang
disiheng
5diwuhang6
di6hang
[root@localhost mytest]# tr -d "hang" < fedora   \\刪除fedora中出現(xiàn)的字符串hang查蓉,非單詞乌询。
diyi
dier
dis
disie
5diwu6
di6
[root@localhost mytest]# tr -d "[[:digit:]]" < fedora
diyihang
dierhang
disanhang
disiheng
diwuhang
dihang
[root@localhost mytest]# tr -d "[0-9]" < fedora
diyihang
dierhang
disanhang
disiheng
diwuhang
dihang
[root@localhost mytest]# ll
總用量 12
-rw-r--r--. 1 root root 0 8月 13 22:54 centos
-rw-r--r--. 1 root root 56 8月 13 23:33 fedora
-rw-r--r--. 1 root root 51 8月 13 23:26 suse
-rw-r--r--. 1 root root 106 8月 13 22:57 ubuntu
[root@localhost mytest]# ll | head -2   \\通過(guò)ll命令的輸出作為輸入交給head -2處理,后者處理后輸出到屏幕
總用量 12
-rw-r--r--. 1 root root 0 8月 13 22:54 centos
[root@localhost mytest]# ll | tee suse | head -2   \\將ll命令輸出的內(nèi)容豌研,復(fù)制一份到suse妹田,然后繼續(xù)交由下一個(gè)命令處理
總用量 12
-rw-r--r--. 1 root root 0 8月 13 22:54 centos
[root@localhost mytest]# cat suse
總用量 12
-rw-r--r--. 1 root root 0 8月 13 22:54 centos
-rw-r--r--. 1 root root 56 8月 13 23:33 fedora
-rw-r--r--. 1 root root 51 8月 13 23:26 suse
-rw-r--r--. 1 root root 106 8月 13 22:57 ubuntu
[root@localhost mytest]# ls | tee suse | grep centos
centos
[root@localhost mytest]# cat suse
centos
fedora
suse
ubuntu
[root@localhost mytest]# ls fedora | tee -a suse | tr [a-z] [A-Z]    \\此處tr處理的字符是前一個(gè)命令的輸出通過(guò)管道符做為輸入交給其處理,tee -a追加到文件鹃共。
FEDORA
[root@localhost mytest]# cat suse
centos
fedora
suse
ubuntu
fedora
[root@localhost mytest]#

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末鬼佣,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子霜浴,更是在濱河造成了極大的恐慌晶衷,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,941評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件阴孟,死亡現(xiàn)場(chǎng)離奇詭異晌纫,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)永丝,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)锹漱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人慕嚷,你說(shuō)我怎么就攤上這事哥牍。” “怎么了喝检?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,345評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵嗅辣,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我挠说,道長(zhǎng)澡谭,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,851評(píng)論 1 295
  • 正文 為了忘掉前任纺涤,我火速辦了婚禮译暂,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘撩炊。我一直安慰自己外永,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布拧咳。 她就那樣靜靜地躺著伯顶,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上祭衩,一...
    開(kāi)封第一講書(shū)人閱讀 51,688評(píng)論 1 305
  • 那天灶体,我揣著相機(jī)與錄音,去河邊找鬼掐暮。 笑死蝎抽,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的路克。 我是一名探鬼主播樟结,決...
    沈念sama閱讀 40,414評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼精算!你這毒婦竟也來(lái)了瓢宦?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,319評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤灰羽,失蹤者是張志新(化名)和其女友劉穎驮履,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體廉嚼,經(jīng)...
    沈念sama閱讀 45,775評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡玫镐,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了前鹅。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片摘悴。...
    茶點(diǎn)故事閱讀 40,096評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖舰绘,靈堂內(nèi)的尸體忽然破棺而出蹂喻,到底是詐尸還是另有隱情,我是刑警寧澤捂寿,帶...
    沈念sama閱讀 35,789評(píng)論 5 346
  • 正文 年R本政府宣布口四,位于F島的核電站,受9級(jí)特大地震影響秦陋,放射性物質(zhì)發(fā)生泄漏蔓彩。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評(píng)論 3 331
  • 文/蒙蒙 一驳概、第九天 我趴在偏房一處隱蔽的房頂上張望赤嚼。 院中可真熱鬧,春花似錦顺又、人聲如沸更卒。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,993評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)蹂空。三九已至俯萌,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間上枕,已是汗流浹背咐熙。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,107評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留辨萍,地道東北人棋恼。 一個(gè)月前我還...
    沈念sama閱讀 48,308評(píng)論 3 372
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像分瘦,于是被迫代替她去往敵國(guó)和親蘸泻。 傳聞我的和親對(duì)象是個(gè)殘疾皇子琉苇,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容