作者最新博客地址:http://www.17mark.com
此簡書不再維護正歼。
在系統(tǒng)默認情況下,shell從鍵盤讀(接收)命令的輸入拷橘,并將命令的輸出顯示(寫)到屏幕上。shell的標準命令輸入是Standard Input喜爷,標準輸出(Standard Output)冗疮。
可以在命令行中或shell腳本中指示shell將命令的輸入或輸出重定向到文件。輸入重定向強迫命令從文件中讀輸入而不是從鍵盤檩帐。輸出重定向?qū)⒚畹妮敵鏊鸵砸粋€文件而不是送到屏幕术幔。當命令產(chǎn)生錯誤信息時,這些錯誤信息將被送到標準錯誤(顯示)湃密,通常錯誤信息被送到終端的屏幕上诅挑。
6.1文件描述符與標準輸入/輸出
shell創(chuàng)建的每一個進程都要與文件描述符打交道。其實文件描述符就是Linux系統(tǒng)內(nèi)部使用的文件代號泛源。文件描述符決定從哪里讀入命令所需的輸入和將命令產(chǎn)生的輸出及錯誤顯示送到什么地方拔妥。
以下是文件描述符的進一步解釋,其中达箍,0没龙、1和2為文件描述符的號碼。
0:標準的命令輸入缎玫,文件描述的縮寫為stdin硬纤。
所有處理文件內(nèi)容的命令都是從標準輸入讀入數(shù)據(jù)并將輸出結(jié)果寫到標準輸出邻辉∠酰可能會有讀者問,你怎么知道文件描述符號和它們的縮寫之間的對應(yīng)關(guān)系恩沛?其實方法很簡單在扰,舉個例子。如圖:
1:標準的命令輸出,文件描述的縮寫為stdout赃磨。
2:標準的命令錯誤(信息)筝家,文件描述的縮寫為stderr。
一個簡單的ls命令就獲取了如此重要的信息雷客,顯示結(jié)果中每行的fd是file descriptor(文件描述符)的縮寫芒珠。
如上圖輸出到屏幕就是標準的輸出。
如上圖錯誤信息搅裙,就是標準錯誤信息皱卓。
讀者應(yīng)該了解什么是標準輸出和什么是標準錯誤信息了吧裹芝。
6.2使用find命令搜索文件和目錄
可以使用find命令的層次結(jié)構(gòu)中定位(找到)文件和目錄。find命令可以使用諸如文件名娜汁、文件大小嫂易、文件屬主、修改時間和類型的條件進行搜尋掐禁。find命令在路徑名列表中遞歸地向下遍歷目錄樹以尋找與搜尋條件相匹配的文件怜械。當find命令找到了那些與搜尋條件相匹配的文件時,系統(tǒng)將把滿足條件的每一個文件顯示在終端上傅事。find命令的語法格式如下缕允。
find pathnames expressions actions
為以后面演示方便纫普,我現(xiàn)在展示一下我的目錄文件阅悍。pathnames:搜尋起始的絕對路徑或相對路徑。
例一:
expressions:由一個或多個選項定義的搜尋條件蹭越。如果定義了多個選項障本,find命令將使用它們邏輯與(and)操作的結(jié)果,因此將列出所有滿足全部條件的表達式响鹃。
actions:當文件被定位之后需要進行的操作驾霜。默認操作是將滿足條件的所有路徑打印在屏幕上。在find命令中买置,可以使用如下的條件表達式(expressions)粪糙。
-name 文件名:查找與指定文件名想匹配的文件。在文件名中可以使用通配符堕义。但是它們要放在雙引號之內(nèi)(“”)
-size[+|-]n:查找大胁卵(尺寸)大于+n,或小于-n倦卖,或正好等于n的文件洒擦。在默認情況下,n代表512字節(jié)大小的數(shù)據(jù)塊的個數(shù)怕膛。
-atime[+|-]n:查找訪問時間已經(jīng)超過+n天熟嫩,低于-n天,或正好等于n天之前的文件褐捻。
-user loginID:查找屬于loginID(用戶)名的所有文件掸茅。
-type:查找某一類型的文件,如f(文件)或d(目錄)柠逞。
-perm:查找所有具有某些特定的訪問許可位的文件(以后將介紹)昧狮。
在find命令中,可以使用如下的動作表達式(actions):
-exec 命令 {} ;:在每一個所定位的文件上運行指定的命令板壮。大括號{}表明文件名將傳給前面表達式所表示的命令逗鸣。一個空格、一個反斜線(\)和一個分號(;)表示命令的結(jié)束。
-ok 命令 {} ;:在find命令對每個定位的文件執(zhí)行命令之前需要確認。這實際上就是-exec命令的交互方式拉庶。
-print:指示find命令將當前的路徑名打印在終端屏幕上,這也是默認方式辰企。
-ls:顯示當前路徑名和相關(guān)的統(tǒng)計信息,如i節(jié)點(inode)數(shù)、以K字節(jié)為單位的大小(尺寸)萨蚕、保護模式、硬連接和用戶涉馁。
下面通過一些例子來進一步解釋find命令的具體用法门岔。
find命令是從dog用戶的家目錄(也是當前用戶)開始搜尋名為dog.wolf.baby的文件。
例二:
可以看到如果想查找頭為dog.尾為.baby的文件烤送。上圖三條命令都可以。即在通配符中加不加雙引號都可行糠悯,查找到的結(jié)果也都相同帮坚。但是這里要注意一下,最好使用以上第一種命令進行搜索互艾,因為這是標準的語法试和,其它的不保證在所有的UNIX或Linux系統(tǒng)上都能正常工作。
下面來看其它演示:
例三:可以看到disable_dog.wolf.baby被刪除了,所以現(xiàn)在理解-exec里說的{}的意思了吧昨稼,指的是前方搜索到的文件名节视。空格;是結(jié)束假栓。而且-exec沒有提示信息寻行。
例四:
可以看到 -ok是有交互信息的。輸入y 匾荆,dog1.wolf.girl被刪除了拌蜘。
例五:find . -mtime +3
查找修改時間大于3天的文件,也就是說三天之內(nèi)我沒有修改過的文件牙丽。
例六:find .-mtime -3
查找修改時間在3天之內(nèi)的文件简卧。
例七:find . -atime +3
查找訪問時間大于3天的文件,也就是說三天之內(nèi)我沒有訪問過的文件烤芦。
例八:find . -atime -3
也就是查找訪問時間小于3天的文件举娩。
例九:find ~ -size +20
搜索家目錄下文件大小大于20個數(shù)據(jù)塊的文件。
例十:find ~ -size -2
搜索家目錄下文件大小小于2個數(shù)據(jù)塊的文件。
6.3晓铆、將輸出重定向到文件中
默認情況下勺良,如果同時產(chǎn)生了標準輸出和標準錯誤信息。它們會同時顯示在終端屏幕上骄噪。如圖:
部分截圖尚困。
上圖即有標準輸出也有標準錯誤信息。如/etc/passwd是標準輸出 /etc/pam.d/passwd也是標準輸出链蕊。但是其它權(quán)限不夠就是錯誤信息事甜。他們同時輸出到屏幕上了√显希看上去是不是眼暈逻谦。有沒有方法不讓他們顯示到屏幕上。當然有此時陪蜻,就用到了輸出重定向邦马。輸出重定向的符號是:
>:覆蓋原文件的內(nèi)容
>>:在原文件之后追回內(nèi)容
例1.
我把ls -l的顯示信息輸出重定向到dog_wolf文件中,此命令運行完不會有提示宴卖。
例2:
例用>>符號重定向到dog_wolf2中滋将,然后對比dog_worl和dog_worl2。發(fā)現(xiàn)是一樣的東西 症昏。這時候是不是產(chǎn)生疑惑随闽,為什么兩個是一樣的呢。這是因為這兩個文件剛開始都不存在肝谭,內(nèi)容都為空掘宪,所以都是一樣的了。
然后繼續(xù)使用以下命令攘烛。是不是發(fā)現(xiàn)以前的東西沒有了呢魏滚。
再繼續(xù)實驗。發(fā)現(xiàn)什么医寿,追加到了最后栏赴,前面信息還在。所以發(fā)現(xiàn)區(qū)別了吧靖秩。>這個會覆蓋之前的信息须眷。而>>是輸出重定向追加信息。
6.4重定向標準輸出和標準錯誤信息
讀者應(yīng)該還記得在6.3中顯示結(jié)果有錯誤信息也有正確信息吧沟突。那能不能將正確信息花颗,輸出到文件中,將錯誤信息也輸出到文件中呢惠拭。
例1上圖看到?jīng)]標準信息已經(jīng)被重定向到output.std中了扩劝,6.1中講過1代表標準命令輸出庸论。當然也可以把1去掉 看一下,因為也說過默認是標準輸出棒呛。如圖:
好了相信大家已經(jīng)知道如何將錯誤信息輸出到文件中了聂示。
例2:
是不是驗證了大家的想法呢。哈哈 酷吧簇秒。
那現(xiàn)在有的同學(xué)可能會想能不能同時將兩個信息輸出到兩個文件鱼喉。當然可以啦。Linux只有你想不到?jīng)]有它做不到趋观,強大吧扛禽。
例3:
看到了吧。哈哈皱坛。強大不強大编曼。
那現(xiàn)在有同學(xué)想把錯誤信息和成功信息同時輸出到文件中怎么辦∈1伲看下面掐场。
例4:
下面解釋一下這條命令。
由于passwd 默認是1所以是把標準輸出贩猎,重定向到output_errs中刻肄,后面2>&1表示將2導(dǎo)出到1所指向的文件,也就是將標準錯誤信息也導(dǎo)出到1所指向的文件output_errs中融欧。 強大吧。
現(xiàn)在又有同學(xué)想能不能只使用一個>號就把所有信息全部重定向到一個文件呢卦羡,當然有噪馏。
例5:
看到命令沒,這里的&符號代表了所有的文件描述符號(包括0绿饵、1欠肾、2)。所以&>output_err2就是將所有的信息都導(dǎo)出到output_errs2中拟赊。但這種方式不常用刺桃,因為使用&>表示法可能會在文件中包含一些不需要的信息。
6.5輸入重定向及tr命令
重定向標準輸入的符號是<號吸祟。Linux系統(tǒng)的一些命令只能使用標準輸入瑟慈,如tr命令。
tr是translate的前兩個字符屋匕。該命令的功能是轉(zhuǎn)換葛碧、壓縮/或刪除來自標準輸入的字符并將結(jié)果寫到標準輸出上。tr命令不接受文件名形式的參數(shù)过吻,該命令要求它的輸入被重定向為某個地方进泼。下面通過一個例子來解釋tr命令的輸入重定向。上述功能將大寫字母轉(zhuǎn)變?yōu)樾懽帜浮T撁畹暮x就是之前說的 tr的輸入重定向到某個文件乳绕。并標準輸出到屏幕绞惦。也可使用>重定向輸出到文件中。如下圖
tr命令的另一個用法是將DOS模式的正文文件(以回車符“\r”)和換行符(\n)結(jié)束一行)轉(zhuǎn)換成Linux模式的文件(只用換行符\n來結(jié)束一行)洋措。您可以使用帶有-A選項的cat命令來顯示一下dept.sata文件中的所有內(nèi)容济蝉。可以看到確實是DOS結(jié)束符。現(xiàn)在可以使用tr命令r -d來刪除dept.data文件中每行結(jié)束符中的\r符號并將結(jié)果存入dept.data.unix文件中呻纹。
看下結(jié)果堆生。
6.6、cut(剪切命令)
可以使用cut命令從一個文件中剪切掉某些正文字段(fields,也就是列)并將它們到標準輸出顯示雷酪。實際上cut命令是一個文件維護的命令其語法格式如下:
cut [選項]...[文件名]...
其中的主要選項包括如下內(nèi)容淑仆。
-f:說明(定義)字段(列)
-c:要剪切的字符。
-d:說明(定義)字段的分隔符(默認為Tab)
例1:剪切第二列哥力。顯示在屏幕上蔗怠,也可以重定向到文件中。這里不再做演示吩跋。此命令未使用-d這可以證明文件是以tab做分隔的寞射。
例2:可以看到此處分隔符為,號所以必須加-d選項锌钮。
例3:
-c4-7表示從第4個字符一直取到第7個字符(總共4個字符)桥温。
指點迷津:
其實Linux系統(tǒng)的cut命令就相當于Windows系統(tǒng)的剪切操作,Windows系統(tǒng)的剪切操作是將剪切的內(nèi)容放在了剪貼板上梁丘,而Linux系統(tǒng)的cut命令默認是將剪切的內(nèi)容放在了標準輸出上侵浸。只不過Linux系統(tǒng)的cut命令更強大,但是windows系統(tǒng)的剪切操作更簡單氛谜。 還有一點是不同的剪切之后掏觉,文件中的內(nèi)容是不會像Linux上那樣消失的。
6.7值漫、paste(粘貼)命令
該命令的語法模式如下:
paste [選項]...[文件名]...
下面將兩個文件放合成一個文件澳腹。
如上圖,默認以tab鍵分隔杨何。
我們也可以用,號進行分隔酱塔。不過要加-d選項。如圖晚吞。
6.8延旧、使用col命令將Tab轉(zhuǎn)換成空格
可以看到^號就是tab鍵的意思,上圖命令中 -x就是把tab鍵轉(zhuǎn)換成對等的空格的意思槽地。
col命令還有一些其他的特殊用途迁沫,但是目前我們所關(guān)心的只是這一功能而已芦瘾。
6.9、使用sort命令進行排序集畅。
顯示結(jié)果告訴我們sort命令是按ASCII碼的順序?qū)ψ址M行排序的近弟,即小寫字母在前大寫字母在后。
接下來使用sort命令對test.sort文件進行反向(-r選項的功能)排序并忽略大小寫(-F選項的功能)和去掉重復(fù)行(-u)選項的功能挺智。如圖:
上圖中祷愉,-t: 是以:進行分隔,-k3是:號分隔后的第三列赦颇《可以看到1000 11都排在了1前面說明sort命令是以ASCII碼排序的。再看下圖加-n后按數(shù)字進行排序了媒怯。
6.10订讼、使用uniq命令去掉文件中相鄰的重復(fù)行。
-c:在顯示的行前冠以該行出現(xiàn)的次數(shù)扇苞。
-d:只顯示重復(fù)行欺殿。
-i:忽略字符的大小寫。
-u:只顯示唯一的行鳖敷,即只出現(xiàn)一次的行脖苏。
如上圖可以看到已經(jīng)去掉相鄰重復(fù)的了。
-c功能可以看到該字符出現(xiàn)了多少次定踱。-d只顯示重復(fù)行棍潘。
-i 忽略大小寫。-u只顯示唯一的行崖媚。
6.11蜒谤、管道(|)操作
命令格式如下:
命令1|命令2...
系統(tǒng)會將命令1的標準輸出重定向為命令2的標準輸入≈寥牛可以在任何兩個命令之間插入管道符。管道操作符之前的命令將把輸出寫到標準輸出上资锰。而管道后的命令將把這個標準輸出當作它的標準輸入來讀入敢课。
標準錯誤信息(stderr)并不通過管道傳播,即第1個命令的錯誤信息不會傳給第二個命令绷杜,當然第2個也不會直秆。
例1:利如你是管理員,想要知道目前有幾個用戶在登錄著系統(tǒng)鞭盟。
那么我們可以這樣寫
命令:who | wc -l神奇不神奇
如果想知道目前系統(tǒng)有多少用戶包括未登錄的圾结。
命令:cat /etc/passwd | wc -l
另外想用 ls -l查看/etc下的文件,因太多一屏看不到齿诉,所以可以這樣來
命令ls -l /etc| more
除了以上介紹的管道功能外筝野,還有一個xargs命令晌姚。
目前我的wolf文件夾有這些文件。
然后我想把這些帶有 disable_前掇的給刪除掉歇竟。
命令:
看到xargs的用法了沒挥唠?。
6.12焕议、使用tee命令分流輸出宝磨。
命令:cut -f1 -d: /etc/passwd | tee passwd.cut | sort -r|tee passwd.sort | more
解釋:首先tee passwd.cut命令將由管道送過來的數(shù)據(jù)存入passwd.cut文件中,同時還通過管道將這些數(shù)據(jù)送給下一個命令進行處理(sort -r命令進行反向排序)盅安。tee passwd.sort命令將由管道送過來的數(shù)據(jù)(反向排序后的用戶名)存入passwd.sort文件唤锉,同時還通過管理將這些數(shù)據(jù)送給下一個命令進行處理(more命令進行分頁顯示。)
明白了嗎别瞭? 窿祥。分流輸出。
6.13畜隶、您應(yīng)該撐握的內(nèi)容
什么是標準輸入/輸出及標準錯誤信息壁肋?
文件描述符與標準輸入/輸出及標準錯誤信息的關(guān)系。
怎樣利用find命令搜索文件和目錄籽慢?
怎樣在所定位的文件上運行指定的命令浸遗。(-exec(-ok) 命令 {} ;)
怎樣將輸出重定向到文件中?
重定向標準輸出和標準錯誤
重定向符號>>和>的區(qū)別箱亿。
怎樣將輸入重定向跛锌?
tr命令的功能與用法。
cut(剪切)命令的用法届惋。
paste(粘貼)命令的用法髓帽。
怎樣使用sort命令排序?
怎樣使用uniq命令去掉相鄰的重復(fù)行脑豹?
怎樣使用管道(|)將獨立而簡單的命令組合成更強的命令郑藏?
怎樣使用tee命令分流輸出?
歡迎一起交流瘩欺,學(xué)習(xí)必盖。