作者最新博客地址:http://www.17mark.com
此簡書不再維護(hù)。
在系統(tǒng)默認(rèn)情況下,shell從鍵盤讀(接收)命令的輸入,并將命令的輸出顯示(寫)到屏幕上。shell的標(biāo)準(zhǔn)命令輸入是Standard Input,標(biāo)準(zhǔn)輸出(Standard Output)。
可以在命令行中或shell腳本中指示shell將命令的輸入或輸出重定向到文件。輸入重定向強(qiáng)迫命令從文件中讀輸入而不是從鍵盤。輸出重定向?qū)⒚畹妮敵鏊鸵砸粋€(gè)文件而不是送到屏幕。當(dāng)命令產(chǎn)生錯(cuò)誤信息時(shí),這些錯(cuò)誤信息將被送到標(biāo)準(zhǔn)錯(cuò)誤(顯示),通常錯(cuò)誤信息被送到終端的屏幕上。
6.1文件描述符與標(biāo)準(zhǔn)輸入/輸出
shell創(chuàng)建的每一個(gè)進(jìn)程都要與文件描述符打交道。其實(shí)文件描述符就是Linux系統(tǒng)內(nèi)部使用的文件代號(hào)。文件描述符決定從哪里讀入命令所需的輸入和將命令產(chǎn)生的輸出及錯(cuò)誤顯示送到什么地方。
以下是文件描述符的進(jìn)一步解釋,其中,0、1和2為文件描述符的號(hào)碼。
0:標(biāo)準(zhǔn)的命令輸入,文件描述的縮寫為stdin。
所有處理文件內(nèi)容的命令都是從標(biāo)準(zhǔn)輸入讀入數(shù)據(jù)并將輸出結(jié)果寫到標(biāo)準(zhǔn)輸出。可能會(huì)有讀者問,你怎么知道文件描述符號(hào)和它們的縮寫之間的對應(yīng)關(guān)系?其實(shí)方法很簡單,舉個(gè)例子。如圖:
1:標(biāo)準(zhǔn)的命令輸出,文件描述的縮寫為stdout。
2:標(biāo)準(zhǔn)的命令錯(cuò)誤(信息),文件描述的縮寫為stderr。
一個(gè)簡單的ls命令就獲取了如此重要的信息,顯示結(jié)果中每行的fd是file descriptor(文件描述符)的縮寫。
如上圖輸出到屏幕就是標(biāo)準(zhǔn)的輸出。
如上圖錯(cuò)誤信息,就是標(biāo)準(zhǔn)錯(cuò)誤信息。
讀者應(yīng)該了解什么是標(biāo)準(zhǔn)輸出和什么是標(biāo)準(zhǔn)錯(cuò)誤信息了吧。
6.2使用find命令搜索文件和目錄
可以使用find命令的層次結(jié)構(gòu)中定位(找到)文件和目錄。find命令可以使用諸如文件名、文件大小、文件屬主、修改時(shí)間和類型的條件進(jìn)行搜尋。find命令在路徑名列表中遞歸地向下遍歷目錄樹以尋找與搜尋條件相匹配的文件。當(dāng)find命令找到了那些與搜尋條件相匹配的文件時(shí),系統(tǒng)將把滿足條件的每一個(gè)文件顯示在終端上。find命令的語法格式如下。
find pathnames expressions actions
為以后面演示方便,我現(xiàn)在展示一下我的目錄文件。pathnames:搜尋起始的絕對路徑或相對路徑。
例一:
expressions:由一個(gè)或多個(gè)選項(xiàng)定義的搜尋條件。如果定義了多個(gè)選項(xiàng),find命令將使用它們邏輯與(and)操作的結(jié)果,因此將列出所有滿足全部條件的表達(dá)式。
actions:當(dāng)文件被定位之后需要進(jìn)行的操作。默認(rèn)操作是將滿足條件的所有路徑打印在屏幕上。在find命令中,可以使用如下的條件表達(dá)式(expressions)。
-name 文件名:查找與指定文件名想匹配的文件。在文件名中可以使用通配符。但是它們要放在雙引號(hào)之內(nèi)(“”)
-size[+|-]n:查找大小(尺寸)大于+n,或小于-n,或正好等于n的文件。在默認(rèn)情況下,n代表512字節(jié)大小的數(shù)據(jù)塊的個(gè)數(shù)。
-atime[+|-]n:查找訪問時(shí)間已經(jīng)超過+n天,低于-n天,或正好等于n天之前的文件。
-user loginID:查找屬于loginID(用戶)名的所有文件。
-type:查找某一類型的文件,如f(文件)或d(目錄)。
-perm:查找所有具有某些特定的訪問許可位的文件(以后將介紹)。
在find命令中,可以使用如下的動(dòng)作表達(dá)式(actions):
-exec 命令 {} ;:在每一個(gè)所定位的文件上運(yùn)行指定的命令。大括號(hào){}表明文件名將傳給前面表達(dá)式所表示的命令。一個(gè)空格、一個(gè)反斜線(\)和一個(gè)分號(hào)(;)表示命令的結(jié)束。
-ok 命令 {} ;:在find命令對每個(gè)定位的文件執(zhí)行命令之前需要確認(rèn)。這實(shí)際上就是-exec命令的交互方式。
-print:指示find命令將當(dāng)前的路徑名打印在終端屏幕上,這也是默認(rèn)方式。
-ls:顯示當(dāng)前路徑名和相關(guān)的統(tǒng)計(jì)信息,如i節(jié)點(diǎn)(inode)數(shù)、以K字節(jié)為單位的大小(尺寸)、保護(hù)模式、硬連接和用戶。
下面通過一些例子來進(jìn)一步解釋find命令的具體用法。
find命令是從dog用戶的家目錄(也是當(dāng)前用戶)開始搜尋名為dog.wolf.baby的文件。
例二:
可以看到如果想查找頭為dog.尾為.baby的文件。上圖三條命令都可以。即在通配符中加不加雙引號(hào)都可行,查找到的結(jié)果也都相同。但是這里要注意一下,最好使用以上第一種命令進(jìn)行搜索,因?yàn)檫@是標(biāo)準(zhǔn)的語法,其它的不保證在所有的UNIX或Linux系統(tǒng)上都能正常工作。
下面來看其它演示:
例三:可以看到disable_dog.wolf.baby被刪除了,所以現(xiàn)在理解-exec里說的{}的意思了吧,指的是前方搜索到的文件名。空格;是結(jié)束。而且-exec沒有提示信息。
例四:
可以看到 -ok是有交互信息的。輸入y ,dog1.wolf.girl被刪除了。
例五:find . -mtime +3
查找修改時(shí)間大于3天的文件,也就是說三天之內(nèi)我沒有修改過的文件。
例六:find .-mtime -3
查找修改時(shí)間在3天之內(nèi)的文件。
例七:find . -atime +3
查找訪問時(shí)間大于3天的文件,也就是說三天之內(nèi)我沒有訪問過的文件。
例八:find . -atime -3
也就是查找訪問時(shí)間小于3天的文件。
例九:find ~ -size +20
搜索家目錄下文件大小大于20個(gè)數(shù)據(jù)塊的文件。
例十:find ~ -size -2
搜索家目錄下文件大小小于2個(gè)數(shù)據(jù)塊的文件。
6.3、將輸出重定向到文件中
默認(rèn)情況下,如果同時(shí)產(chǎn)生了標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤信息。它們會(huì)同時(shí)顯示在終端屏幕上。如圖:
部分截圖。
上圖即有標(biāo)準(zhǔn)輸出也有標(biāo)準(zhǔn)錯(cuò)誤信息。如/etc/passwd是標(biāo)準(zhǔn)輸出 /etc/pam.d/passwd也是標(biāo)準(zhǔn)輸出。但是其它權(quán)限不夠就是錯(cuò)誤信息。他們同時(shí)輸出到屏幕上了。看上去是不是眼暈。有沒有方法不讓他們顯示到屏幕上。當(dāng)然有此時(shí),就用到了輸出重定向。輸出重定向的符號(hào)是:
>:覆蓋原文件的內(nèi)容
>>:在原文件之后追回內(nèi)容
例1.
我把ls -l的顯示信息輸出重定向到dog_wolf文件中,此命令運(yùn)行完不會(huì)有提示。
例2:
例用>>符號(hào)重定向到dog_wolf2中,然后對比dog_worl和dog_worl2。發(fā)現(xiàn)是一樣的東西 。這時(shí)候是不是產(chǎn)生疑惑,為什么兩個(gè)是一樣的呢。這是因?yàn)檫@兩個(gè)文件剛開始都不存在,內(nèi)容都為空,所以都是一樣的了。
然后繼續(xù)使用以下命令。是不是發(fā)現(xiàn)以前的東西沒有了呢。
再繼續(xù)實(shí)驗(yàn)。發(fā)現(xiàn)什么,追加到了最后,前面信息還在。所以發(fā)現(xiàn)區(qū)別了吧。>這個(gè)會(huì)覆蓋之前的信息。而>>是輸出重定向追加信息。
6.4重定向標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤信息
讀者應(yīng)該還記得在6.3中顯示結(jié)果有錯(cuò)誤信息也有正確信息吧。那能不能將正確信息,輸出到文件中,將錯(cuò)誤信息也輸出到文件中呢。
例1上圖看到?jīng)]標(biāo)準(zhǔn)信息已經(jīng)被重定向到output.std中了,6.1中講過1代表標(biāo)準(zhǔn)命令輸出。當(dāng)然也可以把1去掉 看一下,因?yàn)橐舱f過默認(rèn)是標(biāo)準(zhǔn)輸出。如圖:
好了相信大家已經(jīng)知道如何將錯(cuò)誤信息輸出到文件中了。
例2:
是不是驗(yàn)證了大家的想法呢。哈哈 酷吧。
那現(xiàn)在有的同學(xué)可能會(huì)想能不能同時(shí)將兩個(gè)信息輸出到兩個(gè)文件。當(dāng)然可以啦。Linux只有你想不到?jīng)]有它做不到,強(qiáng)大吧。
例3:
看到了吧。哈哈。強(qiáng)大不強(qiáng)大。
那現(xiàn)在有同學(xué)想把錯(cuò)誤信息和成功信息同時(shí)輸出到文件中怎么辦。看下面。
例4:
下面解釋一下這條命令。
由于passwd 默認(rèn)是1所以是把標(biāo)準(zhǔn)輸出,重定向到output_errs中,后面2>&1表示將2導(dǎo)出到1所指向的文件,也就是將標(biāo)準(zhǔn)錯(cuò)誤信息也導(dǎo)出到1所指向的文件output_errs中。 強(qiáng)大吧。
現(xiàn)在又有同學(xué)想能不能只使用一個(gè)>號(hào)就把所有信息全部重定向到一個(gè)文件呢,當(dāng)然有。
例5:
看到命令沒,這里的&符號(hào)代表了所有的文件描述符號(hào)(包括0、1、2)。所以&>output_err2就是將所有的信息都導(dǎo)出到output_errs2中。但這種方式不常用,因?yàn)槭褂?amp;>表示法可能會(huì)在文件中包含一些不需要的信息。
6.5輸入重定向及tr命令
重定向標(biāo)準(zhǔn)輸入的符號(hào)是<號(hào)。Linux系統(tǒng)的一些命令只能使用標(biāo)準(zhǔn)輸入,如tr命令。
tr是translate的前兩個(gè)字符。該命令的功能是轉(zhuǎn)換、壓縮/或刪除來自標(biāo)準(zhǔn)輸入的字符并將結(jié)果寫到標(biāo)準(zhǔn)輸出上。tr命令不接受文件名形式的參數(shù),該命令要求它的輸入被重定向?yàn)槟硞€(gè)地方。下面通過一個(gè)例子來解釋tr命令的輸入重定向。上述功能將大寫字母轉(zhuǎn)變?yōu)樾懽帜浮T撁畹暮x就是之前說的 tr的輸入重定向到某個(gè)文件。并標(biāo)準(zhǔn)輸出到屏幕。也可使用>重定向輸出到文件中。如下圖
tr命令的另一個(gè)用法是將DOS模式的正文文件(以回車符“\r”)和換行符(\n)結(jié)束一行)轉(zhuǎn)換成Linux模式的文件(只用換行符\n來結(jié)束一行)。您可以使用帶有-A選項(xiàng)的cat命令來顯示一下dept.sata文件中的所有內(nèi)容。可以看到確實(shí)是DOS結(jié)束符。現(xiàn)在可以使用tr命令r -d來刪除dept.data文件中每行結(jié)束符中的\r符號(hào)并將結(jié)果存入dept.data.unix文件中。
看下結(jié)果。
6.6、cut(剪切命令)
可以使用cut命令從一個(gè)文件中剪切掉某些正文字段(fields,也就是列)并將它們到標(biāo)準(zhǔn)輸出顯示。實(shí)際上cut命令是一個(gè)文件維護(hù)的命令其語法格式如下:
cut [選項(xiàng)]...[文件名]...
其中的主要選項(xiàng)包括如下內(nèi)容。
-f:說明(定義)字段(列)
-c:要剪切的字符。
-d:說明(定義)字段的分隔符(默認(rèn)為Tab)
例1:剪切第二列。顯示在屏幕上,也可以重定向到文件中。這里不再做演示。此命令未使用-d這可以證明文件是以tab做分隔的。
例2:可以看到此處分隔符為,號(hào)所以必須加-d選項(xiàng)。
例3:
-c4-7表示從第4個(gè)字符一直取到第7個(gè)字符(總共4個(gè)字符)。
指點(diǎn)迷津:
其實(shí)Linux系統(tǒng)的cut命令就相當(dāng)于Windows系統(tǒng)的剪切操作,Windows系統(tǒng)的剪切操作是將剪切的內(nèi)容放在了剪貼板上,而Linux系統(tǒng)的cut命令默認(rèn)是將剪切的內(nèi)容放在了標(biāo)準(zhǔn)輸出上。只不過Linux系統(tǒng)的cut命令更強(qiáng)大,但是windows系統(tǒng)的剪切操作更簡單。 還有一點(diǎn)是不同的剪切之后,文件中的內(nèi)容是不會(huì)像Linux上那樣消失的。
6.7、paste(粘貼)命令
該命令的語法模式如下:
paste [選項(xiàng)]...[文件名]...
下面將兩個(gè)文件放合成一個(gè)文件。
如上圖,默認(rèn)以tab鍵分隔。
我們也可以用,號(hào)進(jìn)行分隔。不過要加-d選項(xiàng)。如圖。
6.8、使用col命令將Tab轉(zhuǎn)換成空格
可以看到^號(hào)就是tab鍵的意思,上圖命令中 -x就是把tab鍵轉(zhuǎn)換成對等的空格的意思。
col命令還有一些其他的特殊用途,但是目前我們所關(guān)心的只是這一功能而已。
6.9、使用sort命令進(jìn)行排序。
顯示結(jié)果告訴我們sort命令是按ASCII碼的順序?qū)ψ址M(jìn)行排序的,即小寫字母在前大寫字母在后。
接下來使用sort命令對test.sort文件進(jìn)行反向(-r選項(xiàng)的功能)排序并忽略大小寫(-F選項(xiàng)的功能)和去掉重復(fù)行(-u)選項(xiàng)的功能。如圖:
上圖中,-t: 是以:進(jìn)行分隔,-k3是:號(hào)分隔后的第三列。可以看到1000 11都排在了1前面說明sort命令是以ASCII碼排序的。再看下圖加-n后按數(shù)字進(jìn)行排序了。
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)會(huì)將命令1的標(biāo)準(zhǔn)輸出重定向?yàn)槊?的標(biāo)準(zhǔn)輸入。可以在任何兩個(gè)命令之間插入管道符。管道操作符之前的命令將把輸出寫到標(biāo)準(zhǔn)輸出上。而管道后的命令將把這個(gè)標(biāo)準(zhǔn)輸出當(dāng)作它的標(biāo)準(zhǔn)輸入來讀入。
標(biāo)準(zhǔn)錯(cuò)誤信息(stderr)并不通過管道傳播,即第1個(gè)命令的錯(cuò)誤信息不會(huì)傳給第二個(gè)命令,當(dāng)然第2個(gè)也不會(huì)。
例1:利如你是管理員,想要知道目前有幾個(gè)用戶在登錄著系統(tǒng)。
那么我們可以這樣寫
命令:who | wc -l神奇不神奇
如果想知道目前系統(tǒng)有多少用戶包括未登錄的。
命令:cat /etc/passwd | wc -l
另外想用 ls -l查看/etc下的文件,因太多一屏看不到,所以可以這樣來
命令ls -l /etc| more
除了以上介紹的管道功能外,還有一個(gè)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í)還通過管道將這些數(shù)據(jù)送給下一個(gè)命令進(jìn)行處理(sort -r命令進(jìn)行反向排序)。tee passwd.sort命令將由管道送過來的數(shù)據(jù)(反向排序后的用戶名)存入passwd.sort文件,同時(shí)還通過管理將這些數(shù)據(jù)送給下一個(gè)命令進(jìn)行處理(more命令進(jìn)行分頁顯示。)
明白了嗎? 。分流輸出。
6.13、您應(yīng)該撐握的內(nèi)容
什么是標(biāo)準(zhǔn)輸入/輸出及標(biāo)準(zhǔn)錯(cuò)誤信息?
文件描述符與標(biāo)準(zhǔn)輸入/輸出及標(biāo)準(zhǔn)錯(cuò)誤信息的關(guān)系。
怎樣利用find命令搜索文件和目錄?
怎樣在所定位的文件上運(yùn)行指定的命令。(-exec(-ok) 命令 {} ;)
怎樣將輸出重定向到文件中?
重定向標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤
重定向符號(hào)>>和>的區(qū)別。
怎樣將輸入重定向?
tr命令的功能與用法。
cut(剪切)命令的用法。
paste(粘貼)命令的用法。
怎樣使用sort命令排序?
怎樣使用uniq命令去掉相鄰的重復(fù)行?
怎樣使用管道(|)將獨(dú)立而簡單的命令組合成更強(qiáng)的命令?
怎樣使用tee命令分流輸出?
歡迎一起交流,學(xué)習(xí)。