arm9教程光盤原理圖嵌入式學(xué)習(xí)linux命令及shell_第1頁(yè)
arm9教程光盤原理圖嵌入式學(xué)習(xí)linux命令及shell_第2頁(yè)
arm9教程光盤原理圖嵌入式學(xué)習(xí)linux命令及shell_第3頁(yè)
arm9教程光盤原理圖嵌入式學(xué)習(xí)linux命令及shell_第4頁(yè)
arm9教程光盤原理圖嵌入式學(xué)習(xí)linux命令及shell_第5頁(yè)
已閱讀5頁(yè),還剩320頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第一部第一部 第1章文件安全與權(quán)限為了防止未用戶你的文件,可以在文件和上設(shè)置權(quán)限位。還可以設(shè)定文件在創(chuàng)建時(shí)所具有的缺省權(quán)限:這些只是整個(gè)系統(tǒng)安全問(wèn)題中的一小部分。在這里我們并不想對(duì)系統(tǒng)安全問(wèn)題的方方面面進(jìn)行全面的探討,只是介紹一下有關(guān)文件和的安全問(wèn)題。 符號(hào)創(chuàng)建文件的用戶和他(她)所屬于的組擁有該文件。文件的屬主可以設(shè)定誰(shuí)具有讀、寫、執(zhí)行該文件的權(quán)限。當(dāng)然,根用戶或系統(tǒng)管理員可以改變?nèi)魏纹胀ㄓ脩舻脑O(shè)置。一個(gè)文件一經(jīng)創(chuàng)建,就具有三種方式: i讓我們使用ls-ltotal4232:這一行告訴我們 -rwxr-xr-x:這是該文件的權(quán)限位。如果除去最前面的橫杠,這里一共是9個(gè)字符,他們分別對(duì)應(yīng)9個(gè)權(quán)限位。通過(guò)這些權(quán)限位,可以設(shè)定用戶對(duì)文件的權(quán)限。這9個(gè)字符可以分為 r、w、x位置上的橫杠表示相應(yīng)的訪1該文件硬的數(shù)目rootroot文件的屬主root所在的缺省組(也叫做root)3578用字節(jié)來(lái)表示的文件長(zhǎng)度,記住,不是KOct14 dmesg還記得前面一節(jié)所提到的文件權(quán)限位前面的那個(gè)字符嗎?我們現(xiàn)在就解釋一下這個(gè)橫杠ls-l命令所列出的結(jié)果的第一位看出,這七種類型是: l符號(hào)(指向另一個(gè)文件)。s套接字文件。bcp-$touchmyfile現(xiàn)在對(duì) 使用ls-l命令我們已經(jīng)創(chuàng)建了一個(gè)空文件,正如我們所希望的那樣,第一個(gè)橫杠告訴我們?cè)撐募且粋€(gè)普通文件。你將會(huì)發(fā)現(xiàn)所創(chuàng)建的文件絕大多數(shù)都是普通文件或符號(hào)文件(后面將會(huì)出現(xiàn)的符號(hào)文件)。 接下來(lái)的三個(gè)權(quán)限位是文件屬主所具有的權(quán)限;再接下來(lái)的三位是與你同組用戶所具有的權(quán)限,這里是admin組;最后三位是其他用戶所具有的權(quán)限。在該命令的結(jié)果中,我所屬于的缺省組也顯示了出來(lái)。下面是對(duì)該文件權(quán)限的精確描述:表1-1ls-l(第一個(gè)字符 (接下來(lái)的三個(gè)字符 (再接下來(lái)的三個(gè)字符)r- (最后三個(gè)字符)r- 因此,這三組字符(除了第一個(gè)字符)文件屬主缺省組(一個(gè)用戶可以屬于很多的組)這里我們采用另外式來(lái)表示剛才所列出myfile的文件權(quán)限 你可能經(jīng)意到了myfile在創(chuàng)建的時(shí)候并未給屬主賦予執(zhí)行權(quán)限,在用戶創(chuàng)建文件時(shí),系統(tǒng)不會(huì)自動(dòng)地設(shè)置執(zhí)行權(quán)限位。這是出于加強(qiáng)系統(tǒng)安全的考慮。必須手工修改這一權(quán)限位:后面講到umask命令時(shí),你就會(huì)明白為什么沒(méi)有獲得執(zhí)行權(quán)限。然而,你可以針對(duì) 設(shè)置執(zhí)行權(quán)限位,但這與文件執(zhí)行權(quán)限位的意義有所不同,這一點(diǎn)在后面討論。上面這段關(guān)于權(quán)限位的內(nèi)容可能不太好理解,讓我們來(lái)看幾個(gè)例子(見(jiàn)表1-2)更令人迷惑的是,對(duì)于文件屬主來(lái)說(shuō),在只有讀權(quán)限位被置位的情況下,仍然可以通過(guò)文件重定向的方法向該文件寫入。過(guò)一會(huì)兒我們就會(huì)看到,能否刪除一個(gè)文件還依賴于該文件所在權(quán)限位的設(shè)置。表1-2 r r--r-- 文件屬主和同組用戶(一般來(lái)說(shuō),是文件屬主所在的缺省組)可讀r--r--r-- rwxr--r rwxr-x rwxr-xr- rw-rw rw-rw-r rw-rw- 對(duì)于屬于你的文件,可以按照自己的需要改變其權(quán)限位的設(shè)置。在改變文件權(quán)限位設(shè)置之前,要仔細(xì)地想有哪些用戶需要你的文件(包括你的)??梢允褂胦d命令來(lái)改變文件權(quán)限位的設(shè)置。這一命令有比較短的絕對(duì)模式和長(zhǎng)一些的符號(hào)模式。我們先來(lái)看一看符號(hào)模式。od[who]operator[permission]filenameu文件屬主權(quán)限。g同組用戶權(quán)限。oa所有用戶(文件屬主、同組用戶及其他用戶)+增限-=設(shè)定權(quán)限。r讀權(quán)限。文件屬主和組set-ID粘性位*l給文件加鎖,使其他用戶無(wú)法 *在列文件或時(shí),有時(shí)會(huì)遇到“t”位?!皌”代表了粘性位。如果在一個(gè)上出現(xiàn)“t”位,這就意味著該中的文件只有其屬主才可以刪除,即使某個(gè)同組用戶具有和屬主不過(guò)由于的內(nèi)存價(jià)格如此之低,大可不必理會(huì)文件的“t”的使用。 od命令的例子。假定myfile文件最初具有這樣的權(quán)限:rwxrwxrwx:命 結(jié) 含oda-xrw-rw-odog-wrw-r--r-odg+wrw-rw-r-odu+xrwxrw-r-odgo+xrwxrwxr- (所有其他用戶 odu+xo-wmyfile現(xiàn)在已經(jīng)使文件屬主對(duì)myfile文件具有讀、寫執(zhí)行的權(quán)限,而admin組的用戶對(duì)該文件具如果希望某個(gè)文件對(duì)你自己來(lái)說(shuō)可執(zhí)行,而且你對(duì)該文件的缺省權(quán)限很放心,那么只要使它對(duì)你來(lái)說(shuō)具有執(zhí)行權(quán)限即可。 odu+xod[mode] 八進(jìn) 八數(shù) 數(shù) 在設(shè)定權(quán)限的時(shí)候,只需按照表1-3查出與文件屬主、同組用戶和其他用戶所具有的權(quán)限相應(yīng)的權(quán)限表示應(yīng)為644,它的意思就是: (文件屬主可讀、寫 0040(同組用戶可讀 0004(其他用戶可讀 1-4表1-4rwrwrw4+2+4+2+4+2+使用表1-4,可以更容易地計(jì)算出相應(yīng)的權(quán)限值,只要分別針對(duì)文件屬主、同組用戶和其他用戶把相應(yīng)權(quán)限下面的數(shù)字加在一起就可以了。rw r- r-4+ 以下是一 含odrw-rw-odrw-r--r-odrwxr--r-odrw-rw-r-odrwx--odr--r--r-我現(xiàn)在希望使自己對(duì)該文件可讀、寫和執(zhí)行,admin od還可以通過(guò)使用-R選項(xiàng)連同 od-R664/usr/local/home/dave/*這樣就可以一次將/usr/local/home/dave下的所有文件連同各個(gè)子下的文件的權(quán)限全部設(shè)置為文件屬主和同組用戶可讀和寫,其他用戶只讀。使用-R選項(xiàng)一定要謹(jǐn)慎,只有在需要改變樹下全部文件權(quán)限時(shí)才可以使用。上面的例子中既有絕對(duì)模式的,也有符號(hào)模式的,我們可以從中看出,如果使用該命令的符號(hào)模式,可以設(shè)置或取消個(gè)別權(quán)限位,而在絕對(duì)模式中則不然。我個(gè)人傾向于使用符號(hào)模式,因?yàn)樗冉^對(duì)模式方便快捷。還記得面介紹od命令時(shí)講過(guò),的權(quán)限位和文件有所不同?,F(xiàn)在我們來(lái)看看其中的區(qū)別。的讀權(quán)限位意味著可以列出其中的內(nèi)容。寫權(quán)限位意味著可以在該中創(chuàng)建文件,如果不希望其他用戶在你的中創(chuàng)建文件,可以取消相應(yīng)的寫權(quán)限位。執(zhí)行權(quán)限位則意味著搜索和該(見(jiàn)表1-5、表1-6)。 drwxrwxr-drwxr-xr--讀drwxr-xr-如果把同組用戶或其他用戶針對(duì)某 的權(quán)限設(shè)置為--x,那么他們將無(wú)法列出 中有一個(gè)執(zhí)行位置位的或程序,只要用戶知道它的路徑和文件名, 的權(quán)限將會(huì)覆蓋 中文件的權(quán)限。例如,如 而其中的文件pay 并未給admin組的用戶賦予執(zhí)行權(quán)限,所 應(yīng)商不允許實(shí)現(xiàn)這一位,或者即使它被置位,也完全忽略它的存在,因?yàn)樗鼤?huì)帶來(lái)安全性風(fēng)險(xiǎn)。那么人們?yōu)楹稳绱舜篌@小怪呢?suid意味著如果某個(gè)用戶對(duì)屬于自己的s 設(shè)置了這種權(quán)限,那么其他用戶在執(zhí)行這一時(shí)也會(huì)具有其屬主的相應(yīng)權(quán)限。于是,如果根用戶的某一個(gè)設(shè)置了這樣的權(quán)限,那么其他普通用戶在執(zhí)行它的期間也同樣具有根用戶的權(quán)限。同樣的原則也適用于guid,相應(yīng)的用戶將具有該文件所屬用戶組中用戶的權(quán)限。為什么要使用這種類型的?這里有一個(gè)很好的例子。我管理著幾個(gè)大型的數(shù)據(jù)庫(kù)系統(tǒng),而對(duì)它們進(jìn)行備份需要有系統(tǒng)管理權(quán)限。我寫了幾個(gè),并設(shè)置了它們的guid,這樣我指定的一些用戶只要執(zhí)行這些就能夠完成相應(yīng)的工作,而無(wú)須以數(shù)據(jù)庫(kù)管理員的登錄,以免不破壞了數(shù)據(jù)庫(kù)服務(wù)器。通過(guò)執(zhí)行這些,他們可以完成數(shù)據(jù)庫(kù)備份及其他管理任務(wù),但是在這些運(yùn)行結(jié)束之后,他們就又回復(fù)到他們作為普通用戶的權(quán)限。有相當(dāng)一些NIX命令也設(shè)置了sud和gud。如果想找出這些命令,可以進(jìn)入n或/bn目面$ls-l|grep'^...s'上面令是用來(lái)查找suid文件的$ls-l|grep'^...s..s'上面令是用來(lái)查找suid和guid的一旦設(shè)置了這一位,一個(gè)s將出現(xiàn)在的位置上。記住:在設(shè)置su或guid同,相應(yīng)的執(zhí)置guid那么必要該用戶具執(zhí)行權(quán)。如件login設(shè)置suid,它當(dāng)前具有的限為wxw-r--(741),需要在使用 od命令時(shí)該限數(shù)字前加上一個(gè)4,即 od4741為srw-r-- od4741logit表1-7設(shè)置 od rwsr-xr- od rws--s-- 文件被設(shè)置了suid和guidod rwsrw-r 還可以使用符號(hào)方式來(lái)設(shè)置suid/guidrwxr-xr-x,那么odu+s<filename> od命令并不會(huì)對(duì)所設(shè)置的權(quán)限組合做什么檢查。因此,不要看到一個(gè)文件具有執(zhí)行權(quán)限,當(dāng)你創(chuàng)建一個(gè)文件時(shí),你就是該文件的屬主。一旦你擁有某個(gè)文件,就可以改變它的所,把它的所交給另外一個(gè)/etc/passwd文件中存在的合法用戶??梢允褂糜脩裘蛴脩鬒D號(hào)來(lái)完成這一操作。在改變一個(gè)文件的所時(shí),相應(yīng)的suid也將被清除,這是出于安全性的考慮。只有文件的屬主和系統(tǒng)管理員可以改變文件的所。一旦將文件的所交給另外一個(gè)用戶,就無(wú)法再重新收回它的所。如果真的需要這樣做,那么就只有求助于系統(tǒng)管理員了。od-R-howner-R選項(xiàng)意味著對(duì)所有子下的文件也都進(jìn)行同樣的操作。-h選項(xiàng)意味著在改變符號(hào)文件project的所現(xiàn)在由用戶louise交給了用戶pauline用戶pauline現(xiàn)在把該文件所屬的組由admin變?yōu)閟ybadmin(系統(tǒng)中的另外一個(gè)用戶組 或者可以使用id上面令告訴我們用戶matty屬于sybadmin、appsgen和post用戶組當(dāng)最初登錄到系統(tǒng)中時(shí),umask命令確定了你創(chuàng)建文件的缺省模式。這一命令實(shí)際上和odumask值,以確保你創(chuàng)建的 ,umask命令是在/etc/profile文件中設(shè)置的,每個(gè)用戶在登錄時(shí)都會(huì)這個(gè)文件,所以如果希望改變所有用戶的umask,可以在該文件中加入相應(yīng)的條目。如果希望永久性地設(shè)置自己的umask值,那么就把它放在自己$HOME下的.profil或.bash_profile文件中。umask命令允許你設(shè)定文件創(chuàng)建時(shí)的缺省模式,對(duì)應(yīng)每一類用戶(文件屬主、同組用戶、其他用戶)存在一個(gè)相應(yīng)的umask值中的數(shù)字。對(duì)于文件來(lái)說(shuō),這一數(shù)字的最大值分別是6。系統(tǒng) od命令增加這一權(quán) 來(lái)說(shuō),umask中各個(gè)數(shù)字最大可以到7。umask計(jì)算出你的umask 省權(quán)限。表1-8列出了與權(quán)限位相對(duì)應(yīng)的umask值。在計(jì)算umask值時(shí),可以針對(duì)各類用戶分別在這張表中按照所需要的文件/ 例如,umask值002所對(duì)應(yīng)的文件 創(chuàng)建缺省權(quán)限分別為664和775還有另外一種計(jì)算umask值的方法。我們只要記住umask 3522601700例如,對(duì)于umask值002,相應(yīng)的文件 777(所有用戶都具有讀、寫和執(zhí)行權(quán)限)。第二步,在下面一行按照umask值寫下相應(yīng)的位,在本例中是002。 第四步,對(duì)于文件來(lái)說(shuō),在創(chuàng)建時(shí)不能具有文件權(quán)限,只要拿掉相應(yīng)的執(zhí)行權(quán)限比特即可。這就是上面的例子,其中umask值為rwxrwxrwxumask值為 rwxrwxr-x rw-rw-r--(664) 1)rwxrwxrwx2)umask值為----w-- rwxr-xr-x4)文件權(quán) rw-r--r-- 表1-9列出了一些umask值及它們所對(duì)應(yīng) 如果想知道當(dāng)前的umask值,可以使用umask如果想要改變umask值,只要使用umask$umask確認(rèn)一下系統(tǒng)是否已經(jīng)接受了新的umask在使用umask命令之前一定要弄清楚到底希望具有什么樣的文件/ 可能會(huì)得到一些非常奇怪的結(jié)果;例如,如果將umask值設(shè)置為600,那么所創(chuàng)建的文件/的缺省權(quán)限就是存在兩種不同類型的,軟和硬,這里我們只討論軟。軟實(shí)際上就是一個(gè)指向文件的指針。你將會(huì)發(fā)現(xiàn)這種軟使用起來(lái)非常方便。下面我們就解釋一下符號(hào)是怎么回事。比方說(shuō)在/usr/local/admin/sales 含有銷售信息的文件,銷售部門的每一個(gè)人都想看這份文件。你可以在每一位用戶的$HOME下建立一個(gè)指向該文件的,而不是在每個(gè) 件時(shí),只需改變一個(gè)源文件即可。每個(gè)銷售$HOME中的可以起任何名字,不必和源如果有很多子,而進(jìn)入這些很費(fèi)時(shí)間,在這種情況下也非常有用。可以針對(duì)$HOME下的一個(gè)很深的子創(chuàng)建一個(gè)。還有,比如在安裝一個(gè)應(yīng)用程序時(shí),它的日志被保存到/usr/opt/app/log下,如果想把它保存在另外一個(gè)你認(rèn)為更方便下,可以建立一個(gè)指向該的。ln[-s]source_pathtarget_path 假如系統(tǒng)中有40個(gè)銷售和管理用戶,銷售用戶使用一個(gè)銷售應(yīng)用程序,而管理用戶使用一個(gè)管理應(yīng)用程序。我作為系統(tǒng)管理員該怎么做呢?首先刪除它們各自$HOME下的所有.profile文件。然后在/usr/local/s/下創(chuàng)建兩個(gè)profile文件,一個(gè)是file,一個(gè)是file,它們分別為銷售和管理人員提供了所需的環(huán)境,并引導(dǎo)他們進(jìn)入相應(yīng)的應(yīng)的$HOME下分別創(chuàng)建一個(gè)指向file的,在所有管理人員的$HOME向file文件的。注意,不必在上面命令格式中的target_pathln命令會(huì)自動(dòng)創(chuàng)建該文件。下面就是我對(duì)銷售人員matty(你所看到的可能會(huì)與此稍有差別)這就是我所要做的全部工作;對(duì)于管理人員也是如此。而且如果需要作任何修改的話, /usr/opt/ 下,但其他所有的日志都保存在/var/adm/logs 下建立一個(gè)指向原有文件的就可以在一個(gè)地方看所有的日志了,而不必花費(fèi)很多時(shí)間分別進(jìn)入各個(gè)相應(yīng)的 。下面就是所用的命令:$ln-s/usr/opt/monitor/regstar/reg.log/var/adm/logs/monitor.log不管是否在同一個(gè)文件系統(tǒng)中,都可以創(chuàng)建。在創(chuàng)建的時(shí)候,記在原有設(shè)置執(zhí)行權(quán)限。一旦創(chuàng)建,將具限777或rwxrwxrwx,但是實(shí)際的原 的,因?yàn)橛行?yīng)用程序認(rèn)為存在/var/tmp 保存一些臨時(shí)文件。為了使所有的臨時(shí)文件都放在一個(gè)地方,可以使用ln命令在/var 的?,F(xiàn)在如果我在 本章介紹了一些有關(guān)文件安全的基本概念。如果這些命令能夠使用得當(dāng)而且使用得比較謹(jǐn)慎,應(yīng)該不會(huì)有什么問(wèn)題。手指輕輕一敲就有可能輸入od-R這樣令,它將改變整個(gè)文件系統(tǒng)的權(quán)限,如果沒(méi)有做備份的話,沒(méi)有幾年的時(shí)間恐怕是無(wú)法恢復(fù)了,所以在輸入這些命令時(shí),千萬(wàn)不要在手指上貼膏藥!是否使用設(shè)置了suid的完全取決于你自己。如果使用的話,一定要確保能夠它的使用,而且不要以根用戶設(shè)置suid。第2章使用find和有時(shí)可能需要在系統(tǒng)中查找具有某一特征的文件(例如文件權(quán)限、文件屬主、文件長(zhǎng)度、文件類型等等)。這樣做可能有很多原因??赡艹鲇诎踩缘目紤],或是一般性的系統(tǒng)管理任務(wù),或許只是為了找出一個(gè)不知保存在什么地方的文件。Find是一個(gè)非常有效的工具,它可以遍歷當(dāng)前 甚至于整個(gè)文件系統(tǒng)來(lái)查找某些文件或 。由于find具有如此強(qiáng)大的功能,所以它的選項(xiàng)也很多,其中大部分選項(xiàng)都值得我們花時(shí)間來(lái)了解一下。即使系統(tǒng)中含有網(wǎng)絡(luò)文件系統(tǒng)(NFS),find命令在該文件系統(tǒng)中同樣有效,只要你具有相應(yīng)的權(quán)限。在運(yùn)行一個(gè)非常消耗資源的find命令時(shí),很多人都傾向于把它放在執(zhí)行,因?yàn)楸闅v一個(gè)大的文件系統(tǒng)可能會(huì)花費(fèi)很長(zhǎng)的時(shí)間(這里是指30G字節(jié)以上的文件系統(tǒng))。findpathname-options[-print-exec- find命令所查找 路徑。例如用.來(lái)表示當(dāng) - find命令對(duì)匹配的文件執(zhí)行該參數(shù)所給出的s 命令。相應(yīng)命令的形式為'comm-and'{}\;,注意{}和\;之間的空格。-ok和-exec的作用相同,只不過(guò)以一種更為安全的模式來(lái)執(zhí)行該參數(shù)所給出的s find命令有很多選項(xiàng)或表達(dá)式,每一個(gè)選項(xiàng)前面跟隨一個(gè)橫杠-。讓我們先來(lái)看一下該命- - - 使用這一選項(xiàng)可以使find命令不在當(dāng)前指定 中查找,如果同時(shí)使用了-選項(xiàng),那么-prune選項(xiàng)將被find- - -mtime-n+ 表示文件更改時(shí)間距現(xiàn)在n天以前。Find命令還有-atime和-ctime選項(xiàng),但它們都和-mtime相似,所以我們?cè)谶@里只介紹-mtime- - -newerfile1! 查找更改時(shí)間比文件file1新但比文件file2- b-d c-p-l-符號(hào)文件f--size 查找文件長(zhǎng)度為n塊的文件,帶有c- - - 在查找文件時(shí)不文件系統(tǒng)mount點(diǎn)- 如果find命令遇到符號(hào)文件,就至所指向的文件- 文件名選項(xiàng)是find命令最常用的選項(xiàng),要么單獨(dú)使用該選項(xiàng),要么和其他選項(xiàng)一起使用??梢允褂媚撤N文件名模式來(lái)匹配文件,記住要用引號(hào)將文件名模式引起來(lái)。 $find~-name"*.txt"-print 及 $find.-name"*.txt"-print $find.-name"[A-Z]*"-print想要在 $find/etc-name"host*"-print想要查找 $find~name"*prinfindprint要想讓系統(tǒng)高負(fù)荷運(yùn)行,就從根 開始查找所有的文件。如果希望在系統(tǒng)管理員那保留一個(gè)好印象的話,最好在這么做之前考慮清楚!$find/-name"*"-print 查找文件名以兩個(gè)小寫字母開頭,跟著是兩個(gè)數(shù)字,最后是*.txt的文件,下面令就能夠返回名為ax37.txt的文件:$find.-name"[a-z][a-z][0--9][0--9].txt"-print如果希望按照文件權(quán)限模式來(lái)查找文件的話,可以采用-perm選項(xiàng)。你可能需要找到所有用戶都具有執(zhí)行權(quán)限的文件,或是希望查看某個(gè)用戶下的文件權(quán)限類型。在使用這一選為了在當(dāng)前下查找文件權(quán)限位為755的文件,即文件屬主可以讀、寫、執(zhí)行,其他用$find.-perm755-print如果希望在當(dāng)前下查找所有用戶都可讀、寫、執(zhí)行的文件(要這種情況),我們可以使用find命令的-perm選項(xiàng)。在八進(jìn)制數(shù)字前面要加一個(gè)橫杠-。在下面令中-perm代表按照文件權(quán)限查找,而‘007’和你在od命令的絕對(duì)模式中所采用的表示法完全相同。$find.-perm-007-print如果在查找文件時(shí)希望忽略某個(gè) ,因?yàn)槟阒滥莻€(gè) 中沒(méi)有你所要查找的文件,那么可以使用-prune選項(xiàng)來(lái)需要忽略的 。在使用-prune選項(xiàng)時(shí)要當(dāng)心,因?yàn)槿绻阃绻M?下查找文件,但不希望在 $find/apps-name"/apps/bin"-prune-o-print如果希望按照文件屬主查找文件,可以給出相應(yīng)的用戶名。例如,在$HOME $find~-userdave-print在 $find/etc-useruucp-print為了查找屬主帳戶已經(jīng)被刪除的文件,可以使用-nouser/etc/passwd文件中沒(méi)有有效帳戶的文件。在使用-nouser選項(xiàng)時(shí),不必給出用戶名;find命令能夠?yàn)槟阃瓿上鄳?yīng)的工作。例如,希望在/home $find/home-nouser-print就像user和nouser選項(xiàng)一樣,針對(duì)文件所屬于的用戶組,find命令也具有同樣的選項(xiàng),為 $find/apps-groupaccts-print要查找沒(méi)有有效所屬用戶組的所有文件,可以使用nogroup選項(xiàng)。下面的find命令從文件 $fine/-nogroup-print如果希望按照更改時(shí)間來(lái)查找文件,可以使用mtime選項(xiàng)。如果系統(tǒng)突然沒(méi)有可用空間了,很有可能某一個(gè)文件的長(zhǎng)度在此期間增長(zhǎng)迅速,這時(shí)就可以用mtime選項(xiàng)來(lái)查找這樣的文件。用減號(hào)-來(lái)限定更改時(shí)間在距今n日以內(nèi)的文件,而用加號(hào)+來(lái)限定更改時(shí)間在距今n希望在系統(tǒng) 下查找更改時(shí)間在5日以內(nèi)的文件,可以用$find/-mtime-5-print為了在 $find/var/adm-mtime+3-print如果希望查找更改時(shí)間比某個(gè)文件新但比另一個(gè)文件舊的所有文件,可以使用-newer選newest_file_name!oldest_file_name下面給出的find命令能夠查找更改時(shí)間比文件age.awk新但比文件belts.awk如果想使用find命令的這一選項(xiàng)來(lái)查找更改時(shí)間在兩個(gè)小時(shí)以內(nèi)的文件,除非有一個(gè)現(xiàn)成的文件其更改時(shí)間恰好在兩個(gè)小時(shí)以前,否則就沒(méi)有可用來(lái)比較更改時(shí)間的文件。為了解決這一問(wèn)題,可以首先創(chuàng)建一個(gè)文件并將其日期和時(shí)間戳設(shè)置為所需要的時(shí)間。這可以用touc命令來(lái)實(shí)現(xiàn)。假設(shè)現(xiàn)在的時(shí)間是23:40,希望查找更改時(shí)間在兩個(gè)小時(shí)以內(nèi)的文件,可以首先創(chuàng)建這樣一個(gè)符合要求的文件已經(jīng)被創(chuàng)建;這里我們假設(shè)今天是五月四日,而該文件的更改時(shí)間是21:40,比現(xiàn)在剛好早兩個(gè)小時(shí)。 $find.-newerdstamp-print介紹,這里就不再贅述。如果要在 $find/etc-typed-print $find.!-typed-print為了在 $find/etc-typel-print可以按照文件長(zhǎng)度來(lái)查找文件,這里所指的文件長(zhǎng)度既可以用塊(block)來(lái)計(jì)量,也可以Nc;以塊計(jì)量文件長(zhǎng)度只用數(shù)字表示即可。喜歡使用這種以字節(jié)表示的文件長(zhǎng)度,而不用塊的數(shù)目來(lái)表示,除非是在查看文件系統(tǒng)的大小,因?yàn)檫@時(shí)使用塊來(lái)計(jì)量更容易轉(zhuǎn)換。 $find.-size c-print為了在 $find/home/apache-size100c- $find.-size+10-print在使用find命令時(shí),可能希望先匹配所有的文件,再在子中查找。使用depth選項(xiàng)就希望首先備份所有的文件,其次再備中的文件。在下面的例子中,find命令從文件系統(tǒng)的根開始,查找一個(gè)名為CON.FILE的文件。它將首先匹配所有的文件然后再進(jìn)入子中查找。$find/-name"CON.FILE"-depth-print在下面的例子中,我們從當(dāng)前開始查找位于本文件系統(tǒng)中文件名以XC結(jié)尾的文件:$find.-name"*.XC"-mount-printcpiofind命令在整個(gè)文件系統(tǒng)中(的情況下是在部分文件系統(tǒng)中)查找文件,然后用cpio命令將其備份到磁帶上。 中的文件,可以使用下面所給出 (在上面的例子中,第一行末尾的\告訴s命令還未結(jié)束,忽略\后面的回車。在上面例中,應(yīng)注到路徑缺少/。這叫作相對(duì)路徑。之所以使用相對(duì)路徑,是因?yàn)樵趶拇艓е谢謴?fù)這些文件的時(shí)候,可以選擇恢復(fù)文件的路徑。例如,可以將這些文件先恢復(fù)到另外一個(gè) 中,對(duì)它們進(jìn)行某些操作后,再恢復(fù)到原始 中。如果在備份時(shí)使用了絕對(duì)路徑,例如/etc到/etc 中去,別無(wú)其他選擇。在上面的例子中,我告訴find命令首先進(jìn)入/etc ,然后是/home和/apps ,先匹配這些 下的文件然再匹配子 中的件所有這結(jié)將通過(guò)道遞給cpio命令進(jìn)行備份。順便說(shuō)一下,在上面的例子中cpio命令使用了C65536選項(xiàng),我本可以使用B選項(xiàng),不過(guò)這樣每塊的大小只有512字節(jié),而使用了C65536選項(xiàng)后,塊的大小變成了64K字節(jié)(65536/102 當(dāng)匹配到一些文件以后,可能希望對(duì)其進(jìn)行某些操作,這時(shí)就可以使用-exec選項(xiàng)。一旦find命令匹配到了相應(yīng)的文件,就可以用-exec選項(xiàng)中令對(duì)其進(jìn)行操作(在有些操作系統(tǒng)中只允許-exec選項(xiàng)執(zhí)行諸如ls或ls-l這樣令。大多數(shù)用戶使用這一選項(xiàng)是為了查找舊文件并刪除它們。這里我強(qiáng)烈地建議你在真正執(zhí)行rmls命令看一下,確認(rèn)它們是所要?jiǎng)h除的文件。exec選項(xiàng)后面跟隨著所要執(zhí)行令,然后是一對(duì)兒{},一個(gè)空格和一個(gè)\,最后是一個(gè)為了使用exec選項(xiàng),必須要同時(shí)使用print選項(xiàng)。如果驗(yàn)證一下find為了用ls-l命令列出所匹配到的文件,可以把ls-l命令放在find命令的-exec 下的所有普通文件,并在-exec選項(xiàng)中使用ls-為了在 $findlogs-typef-mtime+5-execrm{}記住,在s中用任何方式刪除文件之前,應(yīng)當(dāng)先查看相應(yīng)的文件,一定要當(dāng)使用諸如mv或rm命令時(shí),可以使用-exec選項(xiàng)的安全模式。它將在對(duì)每個(gè)匹配到的文件find.LOG更改時(shí)間在5日以上的文件,并刪除它們,只不過(guò)在刪除之前先給出提示。按y鍵刪除文件,按n令都可以在-exec選項(xiàng)中使用。在下面的例子中我們使用grep命令。findpasswd*”的文件,例如passwd、passwd.old、passwd.bak行g(shù)rep命令看看在這些文件中是否存在一個(gè)rounder $find$HOME-print$find~-print $find.-typef-perm4755-print$find/-typef-size0-execls-l{}為了查找 $find/var/logs-typef-mtime+7-execrm{}$find/-name-groupaudit-print我們的一個(gè)審計(jì)系統(tǒng)每天創(chuàng)建一個(gè)審計(jì)日志文件。日志文件名的最后含有數(shù)字,這樣我們一眼就可以看出哪個(gè)文件是的,哪個(gè)是最舊的。 Admin.log文件編上了序號(hào):admin.log.001、admin.log.002等等。下面的find命令將刪除/logs 中時(shí)間在7日以前、含有數(shù)字后綴的admin.log文件。該命令只檢查三位數(shù)字,所以相應(yīng)日志文件的后綴不要超過(guò)999。$find/logs-name'admin.log[0-9][0-9]'[-0at9i]me+7-execrm{} $find.-typed-print-local-mount|sort$find/dev/rmt-print在使用find命令的-execfind命令將所有匹配到的文件一起傳遞給exec行不幸是些系對(duì)傳遞給exec令長(zhǎng)度有限制,這樣在find命令運(yùn)行幾分鐘之后,就會(huì)出現(xiàn)溢出錯(cuò)誤。錯(cuò)誤信息通常是“參數(shù)列太長(zhǎng)”或“參數(shù)列溢出”。這就是xargsfindFindxags命令,而xags-exec選項(xiàng)那樣。這樣它可以先處理最先獲取的一部分文件,然后是下一批,并如此繼續(xù)下去。在有些系統(tǒng)中,使用-exec為處理每一個(gè)匹配到的文件而發(fā)起一個(gè)相應(yīng)的進(jìn)程,并非將匹配到的文件全部作為參數(shù)一次執(zhí)行;這樣在有些情況下就會(huì)出現(xiàn)進(jìn)程過(guò)多,系統(tǒng)性能下降的問(wèn)題,因而效率不高;而使用xagsxags命令時(shí),究竟是一次獲取所有的參數(shù),還是分批取得參數(shù),以及每一次獲取參數(shù)的數(shù)目都會(huì)根據(jù)該命令的選項(xiàng)及系統(tǒng)內(nèi)核中相應(yīng)的可調(diào)參數(shù)來(lái)確定。下面的例子查找系統(tǒng)中的每一個(gè)普通文件,然后使用xargs下面的例子在整個(gè)系統(tǒng)中查找內(nèi)存信息轉(zhuǎn)儲(chǔ)文件(coredump)/tmp/core.log$find.-name"core"-print|xargsecho"">/tmp/core.log下面的例子在/apps/audit 下查找所有用戶具有讀、寫和執(zhí)行權(quán)限的文件,并收回相的寫權(quán):$find/apps/audit-perm-7-print|xargs odo-在下面的例子中,我們用grep命令在所有的普通文件中搜索device$find/-typef-print|xargsgrep"device"在下面的例子中,我們用grep命令在當(dāng) 下的所有普通文件中搜索DBO這個(gè)詞$find.-name*\-typef-print|xargsgrep"DBO"注意,在上面的例子中,\用來(lái)取消find命令中的*在 find命令是一個(gè)非常優(yōu)秀的工具,它可以按照用戶指定的準(zhǔn)則來(lái)匹配文件。使用exec和xargs可以使用戶對(duì)所匹配到的文件執(zhí)行幾乎所有令。第3章執(zhí)行命當(dāng)你在終端或控制臺(tái)工作時(shí),可能不希望由于運(yùn)行一個(gè)作業(yè)而占住了屏幕,因?yàn)榭赡苓€有更重要的事情要做,比如閱讀電子郵件。對(duì)于密集磁盤的進(jìn)程,你可能希望它能夠在每天的非負(fù)荷時(shí)間段運(yùn)行。為了使這些進(jìn)程能夠在運(yùn)行,也就是說(shuō)不在終端屏幕上運(yùn)行,有幾種選擇方法可供使用。在本章中討論: 系統(tǒng)調(diào)度進(jìn)程??梢允褂盟诿刻斓姆秦?fù)荷時(shí)間段運(yùn)行作業(yè),或在一周或一月 at命令。使用它在一個(gè)特定的時(shí)間運(yùn)行一些特殊的作業(yè),或在晚一些的非負(fù)荷時(shí)間段或負(fù)荷時(shí)間段運(yùn)行。 Nohup使用它在運(yùn)行一個(gè)命令,即使在用戶退出時(shí)也不受影響cron是系統(tǒng)主要的調(diào)度進(jìn)程,可以在無(wú)需人工干預(yù)的情況下運(yùn)行作業(yè)。有一個(gè)叫做crontab令允許用戶提交、編輯或刪除相應(yīng)的作業(yè)。每一個(gè)用戶都可以有一個(gè)crontab來(lái)保存調(diào)度信息??梢允褂盟\(yùn)行任意一個(gè)s 或某個(gè)命令,每小時(shí)運(yùn)行一次,或一周三次,這完全取決于你。每一個(gè)用戶都可以有自己的crontab文件,但在一個(gè)較大的系統(tǒng)中,系統(tǒng)管理員一般會(huì)這些文件,而只在整個(gè)系統(tǒng)保留一個(gè)這樣的文件。系統(tǒng)管理員是通過(guò)cron.deny和cron.allow來(lái)的crontab文件。crontab文件每個(gè)條目中各個(gè)域的意義和格式。 分鐘 月 要運(yùn)行令分<>時(shí)<>日<>月<>星期<>要運(yùn)行令Crontab文件的一個(gè)條目是從左邊讀起的,第一列是分,最后一列是要運(yùn)行令,它位于星期的后面。在這些域中,可以用橫杠-來(lái)表示一個(gè)時(shí)間范圍,例如你希望星期一至星期五運(yùn)行某個(gè)作業(yè),那么可以在星期域使用1-5和星期四運(yùn)行某個(gè)作業(yè),只需要使用1,4來(lái)表示??梢杂眯翘?hào)*來(lái)表示連續(xù)的時(shí)間段。如果你對(duì)某個(gè)表示時(shí)間的域沒(méi)有特別的限定,也應(yīng)該在該域填入*。該文件的每一個(gè)條目必須含有5#3021***/apps/bin/cleanup.sh上面的例子表示每晚的21:30運(yùn)行 下的cleanup.sh4541,10,22**/apps/bin/backup.上面的例子表示每月1、10、22日的4:45運(yùn)行 下的backup.sh101**6,0/bin/find-name"core"-execrm{}上面的例子表示每周六、周日的1:10運(yùn)行一個(gè)find0,3018-23***/apps/bin/dbcheck.sh上面的例子表示在每天18:00至23:00之間每隔30分鐘運(yùn)行 下的dbcheck.sh023**6/apps/bin/qtrend.上面的例子表示每星期六的11:00pm運(yùn)行 下的qtrend.sh你可能已經(jīng)注意到上面的例子中,每個(gè)命令都給出了絕對(duì)路徑。當(dāng)使用 crontab運(yùn)行s時(shí),要由用戶來(lái)給出的絕對(duì)路徑,設(shè)置相應(yīng)的環(huán)境變量。記住,既然是用戶向 cron提交了這些作業(yè),就要向cron提供所需的全部環(huán)境。不要假定cron知道所需要的特殊環(huán)境,它其實(shí)并不知道。所以你要保證在s 中提供所有必要的路徑和環(huán)境變量,除了一些自動(dòng)設(shè)置的全局變量。Crontab[-uuser]-e-l--u-e編輯crontab-l列出crontab-r刪除crontab如果使用自己的名字登錄,就不用使用-u選項(xiàng),因?yàn)樵趫?zhí)行crontab在考慮向cron進(jìn)程提交一個(gè)crontab文件之前,首先要做的一件事情就是設(shè)置環(huán)境變量EDITOR。cron進(jìn)程根據(jù)它來(lái)確定使用哪個(gè)編輯器編輯crontab文件。99%的UNIX和LINUX用戶都使用vi,如果你也是這樣,那么你就編輯$HOME EDITOR=vi;exportEDITOR不妨創(chuàng)建一個(gè)名為<user>cron的文件,其中<user>是用戶名,例如,davecron。在該文件在上面的例子中,系統(tǒng)將每隔15分鐘向控制臺(tái)輸出一次當(dāng)前時(shí)間。如果系統(tǒng)或掛起,從最后所顯示的時(shí)間就可以一眼看出系統(tǒng)是什么時(shí)間停止工作的。在有些系統(tǒng)中,用tty1來(lái)表為了提交你剛剛創(chuàng)建的crontab文件,可以把這個(gè)新創(chuàng)建的文件作為cron$crontabdavecron現(xiàn)在該文件已經(jīng)提交給cron進(jìn)程,它將每隔15 dave你將會(huì)看到和上面類似的內(nèi)容??梢允褂眠@種方法在 中對(duì)crontab文件做一$crontab-l>$HOME/mycron就可以用vi來(lái)編輯crontab文件,相應(yīng)令為:$crontab-可以像使用vi編輯其他任何文件那樣修改crontab加了新的條目,那么在保存該文件時(shí),cron會(huì)對(duì)其進(jìn)行必要的完整性檢查。如果其中的某個(gè)現(xiàn)在保存并退出。最好在crontab文件的每一個(gè)條目之上加入一條注釋,這樣就可以知道現(xiàn)在讓我們使用前面講過(guò)的crontab-l$crontab-如果不誤刪了crontab文件,假設(shè)你在自己的$HOME下還有一個(gè)備份,那么可以將其拷貝到/var/spool/cron/<username>,其中<username是用戶名。如果由于權(quán)限問(wèn)題無(wú)法完成拷貝,可以用:$crontab<filename>其中,<filename>是你在 我建議你在自己的$HOME中保存一個(gè)該文件的副本。我就有過(guò)類似的經(jīng)歷,有數(shù)次誤刪了crontab文件(因?yàn)閞鍵緊挨在e鍵的右邊?。這就是為什么有些系統(tǒng)文檔建議不要直接編輯crontab文件,而是編輯該文件的一個(gè)副本,然后重新提交新的文件。有些crontab的變體有些怪異,所以在使用crontab命令時(shí)要格外。如果遺漏了任何選項(xiàng),crontab可能會(huì)打開一個(gè)空文件,或者看起來(lái)像是個(gè)空文件。這時(shí)敲delete鍵退出,不要按<Ctrl-D>,否則你將丟失crontabat命令允許用戶向cron守護(hù)進(jìn)程提交作業(yè),使其在稍后的時(shí)間運(yùn)行。這里稍后的時(shí)間可能是指10min以后,也可能是指幾天以后。如果你希望在一個(gè)月或更長(zhǎng)的時(shí)間以后運(yùn)行,最好還是使用crontab一旦一個(gè)作業(yè)被提交,at命令將會(huì)保留所有當(dāng)前的環(huán)境變量,包括路徑,不象crontab,只提供缺省的環(huán)境。該作業(yè)的所有輸出都將以電子郵件的形式發(fā)送給用戶,除非你對(duì)其輸出進(jìn)行了重定向,絕大多數(shù)情況下是重定向到某個(gè)文件中。和crontab一樣,根用戶可以通過(guò) 使用atat命令的使用不如對(duì)crontab的使用限制那么嚴(yán)at[-fscript][-m-l-r][time][date]-fscript是所要提交的或命令 清除作業(yè)。為了清除某個(gè)作業(yè),還要提供相應(yīng)的作業(yè)標(biāo)識(shí)(ID);有些UNIX變體只-m at命令的時(shí)間格式非常靈活;可以是H、HH.HHMM、HH:MM或H:M,其中H和分別是小時(shí)和分鐘。還可以使用a.m.或p.m. 使用at命令提交作業(yè)有幾種不同的形式,可以通過(guò)命令行方式,也可以使用at命令提示符。一般來(lái)說(shuō)在提交若干行的系統(tǒng)命令時(shí),我使用at命令提示符方式,而在提交s 如果你想提交若干行令,可以在at命令后面跟上日期/時(shí)間并回車。然后就進(jìn)入了at命令提示符,這時(shí)只需逐條輸入相應(yīng)令,然后按‘<CTRL-D>’退出。下面給出一個(gè)例子:<EOT>就是<CTRL-D>。在21:10find命令。你應(yīng)當(dāng)已經(jīng)注意job1。該命令在完成以后會(huì)將全部結(jié)果以郵件的形下面這些日期/時(shí)間格式都是at如果希望向at命令提交一個(gè) ,使用其命令行方式即可。在提交時(shí)使用-f選項(xiàng)在上面的例子中,一個(gè)叫做db_table.sh的將在明天下午3:00運(yùn)行。$echofind/etc-name"passwd"-print|atnow+1minute一個(gè)作業(yè)被提交后,可以使用atl其中,第一行是作業(yè)標(biāo)識(shí),后面是作業(yè)運(yùn)行的日期/時(shí)間。最后一列a代表at。還可以使用atq命令來(lái)完成同樣的功能,它是at命令的一個(gè)。當(dāng)提交一個(gè)作業(yè)后,它就被拷貝到 清除作業(yè)令格式為atrm[jobno或atrjob要清除某個(gè)作業(yè),首先要執(zhí)行atl命令,以獲取相應(yīng)的作業(yè)標(biāo)識(shí),然后對(duì)該作業(yè)標(biāo)識(shí)使用at-r命令,清除該作業(yè)。有些系統(tǒng)使用at-r[jobno] 可以使用&命令把作業(yè)放到執(zhí)行。命令為什么要在執(zhí)行命令?因?yàn)楫?dāng)在執(zhí)行命令時(shí),可以繼續(xù)使用你的終端做其他事情。適合在運(yùn)行令有find些s 。在運(yùn)行作業(yè)時(shí)要當(dāng)心:需要用戶交互令不要放在執(zhí)行,因?yàn)檫@樣你的機(jī)器就會(huì)在那里傻等。不過(guò),作業(yè)在運(yùn)行一樣會(huì)將結(jié)果輸出到屏幕上,干擾你的工作。如果放在運(yùn)行的作業(yè)會(huì)產(chǎn)生大量的輸出,最好使用下面的方法把它的輸出重定向到某個(gè)文件中:command>out.file2>&1out.file的文件中?,F(xiàn)在我們運(yùn)行一個(gè)find命令,查找名為“srm.conf”的文件,并把所有標(biāo)準(zhǔn)輸出和錯(cuò)誤輸在上面的例子中,在我們成功提交該命令之后,系統(tǒng)給出了它的進(jìn)程號(hào)27015。這里還有另外一個(gè)例子,有一個(gè)叫做ps1的,它能夠截?cái)嗪颓宄械娜罩疚募?,我把它放到去?zhí)行:當(dāng)一個(gè)命令在執(zhí)行的時(shí)候,可以用提交命令時(shí)所得到的進(jìn)程號(hào)來(lái)它的運(yùn)行。在前面的例子中,我們可以按照提交ps1時(shí)得到的進(jìn)程號(hào),用ps命令和grep命令列出這個(gè)進(jìn)程:如果系統(tǒng)不支持psx如果想殺死進(jìn)程可以使用kill命令。當(dāng)一個(gè)進(jìn)程被放到運(yùn)行時(shí), kill-signal[process_number]在殺進(jìn)程的時(shí)候,執(zhí)行下面令(你的進(jìn)程號(hào)可能會(huì)不同)并按回車鍵。系統(tǒng)將會(huì)給出相如果系統(tǒng)沒(méi)有給出任何信息,告訴你進(jìn)程已經(jīng)被殺死,那么不妨等一會(huì)兒,也許系統(tǒng)正kill命令,這次帶上一個(gè)信號(hào)選項(xiàng):如果用上述方法提交了一個(gè)進(jìn)程,那么在退出時(shí)該進(jìn)程將會(huì)被終止。為了使進(jìn)程能夠在退出后繼續(xù)運(yùn)行,可以使用nohup命令,下面我們就介紹這一命令。nohupNohup就是不掛起的意思(nohangup)。nohupcommand如果使用nohup命令提交作業(yè),那么在缺省情況下該作業(yè)的所有輸出都被重定向到一個(gè)名為nohup.out的文件中,除非另外指定了輸出文件:nohupcommand>myout.file在上面的例子中,輸出被重定向到myout.file讓我們來(lái)看一個(gè)例子,驗(yàn)證一下在退出帳戶后相應(yīng)的作業(yè)是否能夠繼續(xù)運(yùn)行。我們先提交一個(gè)名為ps1的日志清除進(jìn)程:現(xiàn)在退出該 我們看到,該還在運(yùn)行。如果系統(tǒng)不支持psx命令,使用ps-ef|grepps1命令如果希望一次提交幾個(gè)命令,最好能夠把它們寫入到一個(gè)s od744quarterend我們還將該的所有輸出都重定向到一個(gè)名為qtr.out的文件中本章中所討論的工具主要是有關(guān)運(yùn)行作業(yè)的。有時(shí)須要對(duì)大文件進(jìn)行大量更改,或執(zhí)行一些復(fù)雜的查找,這些工作最好能夠在系統(tǒng)負(fù)荷較低時(shí)執(zhí)行。創(chuàng)建一個(gè)定時(shí)清理日志文件或完成其他特殊工作的,這樣只要提交一次,就可以每天晚上運(yùn)行,而且無(wú)需你干預(yù),只要看看相應(yīng)的日志就可以了。Cron和其他工具可以使系統(tǒng)管理任務(wù)變得更輕松。第4章當(dāng)你在使用命令行時(shí),有很多時(shí)間都用來(lái)查找你所需要的文件。S提供了一套完整的字符串模式匹配規(guī)則,或者稱之為元字符,這樣你就可以按照所要求的模式來(lái)匹配文件。還可以使用字符類型來(lái)匹配文件名。在命令行方式下,使用元字符更為快捷,所以在本章我們只介紹這部分內(nèi)容。 [...]匹配[][!...]匹配[]當(dāng)s 遇到上述字符時(shí),就會(huì)把它們當(dāng)作特殊字符,而不是文件名中的普通字符,這樣用戶就可以用它們來(lái)匹配相應(yīng)的文件名。使用**.doc匹配所有以.doc*還可以用在文件名的當(dāng)中,在下面的例子中,cl*.sed用于匹配所有以cl開頭、后面跟任在使用cd命令切換路徑時(shí),使用星號(hào)還可以省去輸入整個(gè)路徑名的麻煩,下面給出一個(gè)這樣的例子:使用可以匹配文件名中的任何單個(gè)字符。在下面的例子中,我們列出文件名以任意兩個(gè)字符開頭,接著是R,后面跟任何字符的文件:conf.log結(jié)尾的在下面的例子中,f??*s匹配所有以f開頭、中間是任意兩個(gè)字符、后面跟隨任意字符串、使用[...]可以用來(lái)匹配方括號(hào)-來(lái)連接兩個(gè)字母或數(shù)字,以此來(lái)表示一個(gè)范圍。在下面的例子中,列出了以i或o開頭的文件名:log.[0-9]*,其中[0-9]表示任意單個(gè)數(shù)字,星號(hào)*下面的例子和剛才的有所不同,使用[!0-9]*來(lái)表示非數(shù)字開頭的字符串,其中! 第4章文件名置 $ls[A-$ls[a-$ls[0-為了列出所有以.開頭的文件名(隱含文件,例如.profile、.rhosts、.history等等)$ls使用元字符可以大大減少你在查找文件名上的工作量。這是一種非常有效的模式匹配方法,在后面的章節(jié)中,我們還將在討論正則表達(dá)式的時(shí)候?qū)ξ谋咎幚碇兴婕暗降脑址M(jìn)行更為詳盡的討論。第5章 在s 中,可以用幾種不同的方式讀入數(shù)據(jù):可以使用標(biāo)準(zhǔn)輸入—缺省為鍵盤,或者指定一個(gè)文件作為輸入。對(duì)于輸出也是一樣:如果不指定某個(gè)文件作為輸出,標(biāo)準(zhǔn)輸出總是和終端屏幕相關(guān)聯(lián)。如果所使用命令出現(xiàn)了什么錯(cuò)誤,它也會(huì)缺省輸出到屏幕上,如果不想把這些信息輸出到屏幕上,也可以把這些信息指定到一個(gè)文件中。大多數(shù)使用標(biāo)準(zhǔn)輸入令都指定一個(gè)文件作為標(biāo)準(zhǔn)輸入。如果能夠從一個(gè)文件中數(shù)據(jù),何必要費(fèi)時(shí)費(fèi)力地從鍵盤輸入呢?本章全面討論了sechostring\c\f\t\n上面令將會(huì)有如下的顯示:$echo"Theredpenranoutof必須使用-n選項(xiàng) 還可以用echo命令輸出轉(zhuǎn)義符以及變量。在下面的例子中,你可以讓終端一聲,顯示出$HOME必須使用-n選項(xiàng) $$echo-n"Whatisyourname如果希望在echo命令輸出之后附加換行,可以使用\n還可以在echo->。在下面的例子中一個(gè)字符串被重$echo"Thelogfileshaveallbeendone">myfile$echo"$LOGNAMEcarriedthemoutat`date`">>myfile 的用戶常常會(huì)遇到的一個(gè)問(wèn)題就是如何把雙引號(hào)包含到echo命令的字符串中。引號(hào)是一個(gè)特殊字符,所以必須要使用反斜杠\來(lái)使s echo命令輸出這樣的字符串:“/dev/rmt0”,那么我們只要在引號(hào)前面加上反斜杠\即可:$echo"\"/dev/rmt0"\"指定了一個(gè)變量,那么read將會(huì)把所有的輸入賦給該變量,直至遇到第一個(gè)文件結(jié)束符或回readvarible1varible2在下面的例子中,我們給出了兩個(gè)變量,它們分別被賦予名字和姓氏。s 如果輸入文本域過(guò)長(zhǎng),S JohnLemonDoe,那么第一個(gè)單詞將被賦給第一 的時(shí)候,如果擔(dān)心用戶會(huì)對(duì)此感到迷惑,可以采用每一個(gè)read語(yǔ)句只給一 (續(xù)cat是一個(gè)簡(jiǎn)單而通用令,可以用它來(lái)顯示文件內(nèi)容,創(chuàng)建文件,還可以用它來(lái)顯示控制字符。在使用cat命令時(shí)要注意,它不會(huì)在文件分頁(yè)符處停下來(lái);它會(huì)一下顯示完整個(gè)文more命令或把cat命令的輸出通過(guò)管道傳遞到另外一個(gè)具有分頁(yè)功能令中,請(qǐng)看下面的例子:$catmyfile|或$catmyfile|cat[options]filename1...filename2-v$catmyfile$catmyfile1myfile2myfile3如果希望創(chuàng)建一個(gè)名為bigfile的文件,該文件包含上述三個(gè)文件的內(nèi)容,可以把上面命令的輸出重定向到新文件中:$catmyfile1myfile2myfile3>bigfilecat命令把標(biāo)準(zhǔn)輸出重定向到該文件中,這時(shí)cat命令的輸入是標(biāo)準(zhǔn)輸入鍵盤,你輸入一些文字,輸入完畢后按還可以使用catDOS機(jī)器上ftp過(guò)來(lái)的文件進(jìn)行的例子,在這個(gè)例子中,所有的控制字符<CTRL-M>都在行末顯示了出來(lái)。有一點(diǎn)要提醒的是,如果在敲入了cat以后就直接按回車,該命令會(huì)等你輸入字符。如果|表示。它的一命令1|命令在下面的例子中,在當(dāng)前中執(zhí)行文件列表操作,如果沒(méi)有管道的話,所有文件就會(huì)顯示出來(lái)。當(dāng)s看到管道符號(hào)以后,就會(huì)把所有列出的文件交給管道右邊令,因此管道的含義正如它的名字所暗示的那樣:把信息從一端傳送到另外一端。在這個(gè)例子中,接下來(lái)grep命令在文件列表中搜索quarter1.doc:讓我們?cè)賮?lái)用一幅圖形象地講解剛才的例子(5-1 Is命令的輸 圖5-1sed、awk和grep都很適合用管道,特別是在簡(jiǎn)單的一行命令中。在下面的例子中,who命如果你希望列出系統(tǒng)中所有的文件系統(tǒng),可以使用管道把df命令的輸出傳遞給awkawk顯示出其中的第一列。你還可以再次使用管道把a(bǔ)wk的結(jié)果傳遞給grep命令,去掉最上面的題頭filesystem。當(dāng)然,你沒(méi)準(zhǔn)還會(huì)希望只顯示出其中的分區(qū)名,不顯示/dev/部分,這沒(méi)問(wèn)題;我們只要在后面簡(jiǎn)單地加上另一個(gè)管道符號(hào)和相應(yīng)的sed命令即可。$sortmyfile|teeT來(lái)形象地表示。它把輸出的一個(gè)副本輸送到標(biāo)準(zhǔn)輸出,另一個(gè)副本拷貝到相應(yīng)的文件中。如果希望在看到輸出的同時(shí),也將其存入一個(gè)文件,那么這個(gè)命令再合適不過(guò)了。tee-afiles當(dāng)執(zhí)行某些命令或時(shí),如果希望把輸出保存下來(lái),tee命令非常方便whowho.out文$圖5-2在下面的例子中,我們把一些文件備份到磁帶上,同時(shí)將所備份的文件記錄在tape.log文件中。由于需要不斷地對(duì)文件進(jìn)行備份,為了保留上一次的日志,我們?cè)趖ee命令中使用了-a選項(xiàng)。在上面的例子中,第一行末尾的反斜杠\告訴s 可以在執(zhí)行之前,使用一個(gè)echo命令告訴用戶誰(shuí)在執(zhí)行這個(gè),輸出結(jié)果保存如果不想把輸出重定向到文件中,可以不這樣做,而是把它定向到某個(gè)終端上。在下面的例子中,一個(gè)警告被發(fā)送到系統(tǒng)控制臺(tái)上,表明一個(gè)磁盤清理進(jìn)程即將運(yùn)行。$echo"stand-bydiskcleanupstartingin1minute"|tee/dev/console可以讓不同令使用同一個(gè)日志文件,不過(guò)記使用-a選項(xiàng)當(dāng)我們?cè)趕 中執(zhí)行命令的時(shí)候,每個(gè)進(jìn)程都和三個(gè)打開的文件相聯(lián)系,并使用文件描來(lái)易,s 同時(shí)也給出了相應(yīng)的文件名。 輸入文件—標(biāo)準(zhǔn)輸 輸出文件—標(biāo)準(zhǔn)輸 錯(cuò)誤輸出文件—標(biāo)準(zhǔn)錯(cuò) 系統(tǒng)中實(shí)際上有12個(gè)文件描述符,但是正如我們?cè)谏媳碇兴吹降模?、1、2是標(biāo)準(zhǔn)輸入、輸出和錯(cuò)誤??梢匀我馐褂梦募枋龇?到9。2。這是命令錯(cuò)誤的輸出,缺省是屏幕,同樣也可以是文件。你可能會(huì)問(wèn),為什么會(huì)有一個(gè)專門針對(duì)錯(cuò)誤的特殊文件?這是由于很多人喜歡把錯(cuò)誤單獨(dú)保存到一個(gè)文件中,特別是在處理大的數(shù)據(jù)文件時(shí),可能會(huì)產(chǎn)生很多錯(cuò)誤。如果沒(méi)有特別指定文件說(shuō)明符,命令將使用缺省的文件說(shuō)明符(你的屏幕,更確切地說(shuō)是你的終端。在對(duì)標(biāo)準(zhǔn)錯(cuò)誤進(jìn)行重定向時(shí),必須要使用文件描述符,但是對(duì)于標(biāo)準(zhǔn)輸入和輸出來(lái)說(shuō),51 command> command>> 把標(biāo)準(zhǔn)輸出重定向到一個(gè)文件中(追加command1> command>filename command2> command2>> 把標(biāo)準(zhǔn)輸出重定向到一個(gè)文件中(追加command>>filename2>&1 把標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤一起重定向到一個(gè)文件中(追加)command<filename>filename2 command命令以filename文件作為標(biāo)準(zhǔn)輸入,以filename2文件command< command<< command 把文件描述符mcommand> 把標(biāo)準(zhǔn)輸出重定向到文件描述符mcommand 讓我們來(lái)看一個(gè)標(biāo)準(zhǔn)輸出的例子。在下面令中,把/etc/passwd文件中的用戶ID域按照用戶命排列。該命令的輸出重定向到sort.out文件中。要提醒注意的是,在使用sort命令的時(shí)候(或其他含有相似輸入文件參數(shù)令),重定向符號(hào)一定要離開sort命令兩個(gè)空格,否則該命令$catpasswd|awk-F:'{print$1}'| 1>sort.out$catpasswd|awk-F:'{print$1}'| >sort.out在上面的例子中,所有 名和以account開頭的文件名都被寫入到file.out文件中>filenamels命令的所有$ls>ls.out如果希望追加到已有的文件中在該文件不存在的情況下創(chuàng)建該文件)如果想創(chuàng)建一個(gè)長(zhǎng)度為0的空文件,可以用$>myfile$ <name.txt$sortname.txt在上面的例子中,還可以更進(jìn)一步地通過(guò)重定向?yàn)閟ort命令指定一個(gè)輸出文件name.out。這樣屏幕上將不會(huì)出現(xiàn)任何信息(除了錯(cuò)誤信息以外):$ <name.txt>name.outlouise將收到一個(gè)郵件,其中含有文件contents.txt$maillouise<contents.txt重定向操作符command<<delimiter是一種非常有用令,通常都被稱為“此處”文擋。本后面的節(jié)入討論一題?,F(xiàn)只紹它的能。s 將分界符delimiter之后直至一同樣的界之前的有容都作輸,遇到一分界符,s 就知道輸結(jié)束了這命令對(duì)自或例非常有。以任意義界符delimiter,常見(jiàn)的是EOF,而我最喜歡用MAYDY,這完全取決于個(gè)人的喜好。還可以在<<后面輸入變量。下為myfil的文件,并在其中使用了TERM和LOGNAM變量。會(huì)讓人更容易明白。在這個(gè)例子中,grep命令在文件missiles中搜索trident字符串:grep命令沒(méi)有找到該文件,缺省地向終端輸出了一個(gè)錯(cuò)誤信息?,F(xiàn)在讓我們把錯(cuò)誤重定向到文件/dev/null中(實(shí)際就上是系統(tǒng)的箱):$grep"trident"missiles2>/dev/null如果你在對(duì)更重要的文件進(jìn)行操作,可能會(huì)希望保存相應(yīng)的錯(cuò)誤。下面就是一個(gè)這樣的例子,這一次錯(cuò)誤被保存到grep.err還可以把錯(cuò)誤追加到一個(gè)文件中。在使用一組命令完成同一個(gè)任務(wù)時(shí),這種方法非常有g(shù)rep命令把錯(cuò)誤都輸出到同一個(gè)文件中;由于我們使用了>>進(jìn)行追加,后面一個(gè)命令的錯(cuò)誤(如果有的話)不會(huì)覆蓋前一個(gè)命令的錯(cuò)誤。一個(gè)快速發(fā)現(xiàn)錯(cuò)誤的方法就是,先將輸出重定向到一個(gè)文件中,然后再把標(biāo)準(zhǔn)錯(cuò)誤重定向到另外一個(gè)文件中。下面給出一個(gè)例子:我有兩個(gè)審計(jì)文件,其中一個(gè)的確存在,而且包含一些信息,而另一個(gè)由于某種原因已經(jīng)不存在了(但我不知道)。把這兩個(gè)文件合并到accounts.out文件中。$cataccount_qtr.docaccount_end.doc1>accounts.out2>accounts.err現(xiàn)在如果出現(xiàn)了錯(cuò)誤,相應(yīng)的錯(cuò)誤將會(huì)保存在accounts.err 在合并標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤的時(shí)候,切記s是從左至右分析相應(yīng)令的。下面給出一$cleanup>cleanup.out2>&1在上面的例子中,cleanup的輸出重定向到cleanup.out文件中,而且其錯(cuò)誤也$grep"standard"*>grep.out2>&1grepgrep.out文件中。你在使用前面提到的“此處”文擋時(shí),有可能需要把所有的輸出都保存到一個(gè)文件中,這樣萬(wàn)一出2>&1就可以做到這一點(diǎn),下面給出一個(gè)例子:上面的例子演示了如何把所有的輸出捕捉到一個(gè)文件中。在使用cat沒(méi)什么用處,不過(guò)如果你使用“此處”文擋連接一個(gè)數(shù)據(jù)庫(kù)管理系統(tǒng)(isql連接sybase)或使用ftp,這一點(diǎn)就變得非常重要了,因?yàn)檫@樣就可以捕捉到所有的錯(cuò)誤,以免這些錯(cuò)誤在屏幕上一閃而過(guò),特別是在你不在的時(shí)候。 execcommand其中的command通常是一個(gè) 我所能夠想像得出的描述exec命令最貼切的說(shuō)法就是:它踐踏了你當(dāng)前的 當(dāng)這個(gè)結(jié)束時(shí),相應(yīng)的會(huì)話可能就結(jié)束了。exec命令的一個(gè)常見(jiàn)用法就是在用戶的.profile最后執(zhí)行時(shí),用它來(lái)執(zhí)行一些用于增強(qiáng)安全性的。如果用戶的輸入無(wú)效,該 記住,exec在對(duì)文件描述符進(jìn)行操作的時(shí)候(也只有在這時(shí)),它不會(huì)覆蓋你當(dāng)前的 可以使用exec命令通過(guò)文件描述符打開和關(guān)閉文件。在下面的例子中,我選用了文件描述符4在4到9之間任意選擇一個(gè)數(shù)字。下面的只是從stock.txt文件中讀了兩行,然后把這兩行回顯出來(lái)。該的第一行把文件描述符4指定為標(biāo)準(zhǔn)輸入,然后打開stock.txt文件。接下來(lái)兩行的作用是讀入了兩行文本。接著,作為標(biāo)準(zhǔn)輸入的文件描述符4被關(guān)閉。最后,line1和line2兩個(gè)變下面是這個(gè)小小的文件stock.txt的內(nèi)容上面是一個(gè)關(guān)于文件描述符應(yīng)用的簡(jiǎn)單例子。它看起來(lái)沒(méi)有什么用處。在以后講解循環(huán)cp命令拷貝文本文件的例子。本書通篇可見(jiàn)重定向的應(yīng)用,因?yàn)樗莝中的一個(gè)重要部分。通過(guò)重定向,可以指定命令的輸入;如果有錯(cuò)誤的話,可以用一個(gè)單獨(dú)的文件把它們記錄下來(lái),這樣就可以方便快捷地查找問(wèn)題。這里沒(méi)有涉及的就是文件描述符的應(yīng)用(3~9)。要想應(yīng)用這些文件描述符,就一定會(huì)涉及第6章在執(zhí)行某個(gè)命令的時(shí)候,有時(shí)需要依賴于前一個(gè)命令是否執(zhí)行成功。例如,假設(shè)你希望將一個(gè)中的文件全部拷貝到另外一個(gè)中后,然后刪除源中的全部文件。在刪除之前,你希望能夠確信拷貝成功,否則就有可能丟失所有的文件。如果希望在成功地執(zhí)行一個(gè)命令之后再執(zhí)行另一個(gè)命令,或者在一個(gè)命令失敗后再執(zhí)行另一個(gè)命令,&&和||應(yīng)或s 。S還提供了在當(dāng)前s或子s中執(zhí)行一組命令的方法,即使用(){}使用命令1&&命令這種命令執(zhí)行方式相當(dāng)?shù)刂苯印?&左邊令(命令1)返回真(即返回0,成功被執(zhí)行)后,&&右邊令(命令2)才能夠被執(zhí)行;換句話說(shuō),“如果這個(gè)命令執(zhí)行成功&&那么執(zhí)這里有一個(gè)使用&&在上面的例子中,&&前面的拷貝命令執(zhí)行成功,所以&&后面令(echo命令)被$mv/apps/bin/apps/dev/bin&&rm-r/apps/bin在上面的例子中 將會(huì)被移到 下,如果它沒(méi)有被成功執(zhí)行就不會(huì)刪除 在下面的例子中,文件quarter_end.txtquarte.sorted這一命令執(zhí)行成功之后,文件quarter.sorted才會(huì)被打印出來(lái):$sortquarter_end.txt>quarter.sorted&&lpquarter.sorted使用命令1||命令 第6章命令執(zhí)行順 ||的作用有一些不同。如果||左邊令(命令1)未執(zhí)行成功,那么就執(zhí)行||右邊在上面的例子中,拷貝命令沒(méi)有能夠被成功執(zhí)行,因此||后面令被執(zhí)行這里有一個(gè)更為實(shí)用的例子。我希望從一個(gè)審計(jì)文件中抽取第1個(gè)和第5個(gè)域,并將其輸 文件執(zhí)行了一個(gè)名 的 ,如果該未執(zhí)行成功,該 $cometmonth_end.txt||如果希望把幾個(gè)命令合在一起執(zhí)行,s 提供了兩種方法。既可以在當(dāng)前s 為了在當(dāng)前s 中執(zhí)行一組命令,可以用命令分隔符隔開每一個(gè)命令,并把所有令用圓括號(hào)()括起來(lái)。(命令1;命令如果使用{}來(lái)代替(),那么相應(yīng)令將在子s 行,只有在{}中所有命令的輸出作為一個(gè)整體被重定向時(shí),其中令才被放到子s {命令1;命令我很少單獨(dú)使用這兩種方法。我一般只和&&或||再回到前面那個(gè)comet的例子,如果這個(gè)執(zhí)行失敗了,我很可能會(huì)希望執(zhí)行兩個(gè)以上令,而不只是一個(gè)命令。我可以使用這兩種方法。這是原先那個(gè)例子:$cometmonth_end.txt||現(xiàn)在如果該執(zhí)行失敗了,我希望先給自己發(fā)個(gè)郵件,然后再退出,可以用下面的方在上面的例子中,如果只使用了命令分隔符而沒(méi)有把它們組合在一起,s 后一個(gè)命令(exit。$sortquarter_end.txt>quarter.sorted&&lpquarter.sorted使用命令組合的方法,如果sort48第一部分 在編寫s 時(shí),使用&&和||對(duì)構(gòu)造判斷語(yǔ)句非常有用。如果希望一個(gè)命令執(zhí)行失敗的情況不執(zhí)行后面令,那么本章所講述的方法非常簡(jiǎn)單有效。使用這樣的方法,可以根據(jù)&&或||前面命令的返回值來(lái)控制其后面命令的執(zhí)行。第二部第二部 文本過(guò) 隨著對(duì)UNIX和LINUXs時(shí),從一個(gè)文件中抽取多于一個(gè)字符串將會(huì)很麻煩。例如,在一個(gè)文本中抽取一個(gè)詞,它的頭兩個(gè)字符是大寫的,后面緊跟四個(gè)數(shù)字。如果不使用某種正則表達(dá)式,在s中將不能當(dāng)從一個(gè)文件或命令輸出中抽取或過(guò)濾文本時(shí),可以使用正則表達(dá)式(RE),正則表達(dá)式為了抽取或獲得信息,我們給出抽取操作應(yīng)遵守的一些規(guī)則。這些規(guī)則由一些特殊字符或進(jìn)行模式匹配操作時(shí)使用的元字符組成。也可以使用規(guī)則字符作為模式中的一部分進(jìn)行搜A將查詢A,x將查找字母x。系統(tǒng)自帶的所有大的文本過(guò)濾工具在某種模式下都支持正則表達(dá)式的使用,并且還包括一些擴(kuò)展的元字符集。這里只涉及其中之一,即以字符出現(xiàn)情況進(jìn)行匹配的表達(dá)式,原因是一些系統(tǒng)將這類模式劃分為一組形成基本元字符的集合。這是一個(gè)好想法,本書也采用這種方式。本章設(shè)計(jì)的基本元字符使用在grp和sed命令中,同時(shí)結(jié)合{\\}(以字符出現(xiàn)情況進(jìn)行匹配的元字符)使用在aw 匹配[]內(nèi)字符??梢允且粋€(gè)單字符,也可以是字符序列。可以使用表示[]內(nèi)字符序列范圍,如用[1-5]代替 用來(lái)一個(gè)元字符的特殊含義。因?yàn)橛袝r(shí)在s中一些元字符有特 含義同上,但次數(shù)最少為npattern\{n, 含義同上,但pattern出現(xiàn)次數(shù)在n與m之間句點(diǎn)“.beg開頭,中間夾一個(gè)在ls-l假定正在過(guò)濾一個(gè)文本文件,對(duì)于一個(gè)有10個(gè)字符的集,要求前4個(gè)字符之后為XC,以上例子解釋為前4個(gè)字符任意,5,6字符為XC,后4^只允許在一行的開始匹配字符或單詞。例如,使用ls-l命令,并匹配 這樣做是因?yàn)閘s-l命令結(jié)果每行第一個(gè)字符是d,即代表一個(gè) 以上模式表示,在每行開始,匹配任意3個(gè)字符,后跟4XC,最后為任意4個(gè)字符。^在正在行首第4個(gè)字符為1行首前4個(gè)字符為comp4個(gè)字符為comp,后面緊跟兩個(gè)任意字符,并以ing結(jié)尾,可以說(shuō)$與^$符號(hào)放在匹配單詞后。假定要匹配以將匹配字符u有時(shí)需要查找一些字符或字符串,而它們包含了系統(tǒng)指定為特殊字符的一個(gè)字符。什么是特殊字符?一般意義上講,下列字符可以認(rèn)為是特殊字符:上述模式不認(rèn)為反斜杠后面的字符是特殊字符,而是一個(gè)普通字符,即句點(diǎn)。假定要匹配包含^的各行,將反斜杠放在它前面就可以其特殊含義。如下:即可字符*的特定含義使用[]匹配特定字符串或字符串集,可以用逗號(hào)將括弧內(nèi)要匹配的不同字符串分開,但并不強(qiáng)制要求這樣做(一些系統(tǒng)提倡在復(fù)雜的表達(dá)式中使用逗號(hào),這樣做可以增加模式的可讀性。-”表示一個(gè)字符串范圍,表明字符串范圍從“-”左邊字符開始,到“-”右邊字 在字符序列結(jié)合使用中,可以用[]字符范圍。假定要匹配一單詞,以s開頭,中間有s[a-zA-如要匹 [ou]匹配以字母o或u開頭,后跟任意一個(gè)字符任意次,并以t也許要匹配所有包含system后跟句點(diǎn)的所有單詞,這里S[]在指定模式匹配的范圍或限制方面很有用。結(jié)合使用*與[]更是有益,例如[A-Za-Z]*將[^a-zA-使用*可匹配所有匹配結(jié)果任意次,但如果只要指定次數(shù),就應(yīng)使用\{\},此模式有三種pattern\{n\}匹配模式出現(xiàn)npattern\{n,\}匹配模式出現(xiàn)最少npattern\{n,m}匹配模式出現(xiàn)n到mn,m為0-255中任意整數(shù)。匹配值為匹配A至少4格式如下:前4個(gè)字符是數(shù)字,接下來(lái)是xx,最后4匹配數(shù)字出現(xiàn)4后跟代碼xx在寫正則表達(dá)式時(shí),可能會(huì)有點(diǎn)難度或達(dá)不到預(yù)期效果,一個(gè)好習(xí)慣是在正的正則表達(dá)式前先寫下預(yù)期的輸出結(jié)果。這樣做,當(dāng)寫錯(cuò)時(shí),可以逐漸修改,以消除意外結(jié)果,直至返回正確值。為節(jié)省設(shè)計(jì)基本模式的時(shí)間,表7-2給出一些例子,這些例子并無(wú)特別順序。 以the 匹配單詞signal、signaL 包含may行 只包含USER 以tty 000或 [a-zA- [-][ 0- ^0-0A-Za- 前兩個(gè)字母為De任意字符,最后為(續(xù) 以^q 單詞 [0-]\{\-[0-9]\{\-[0- 日期格式dd-mm-[0-9\{3\}\.0-9\{3\}\.0-9]\{3\}\.0- IP地址格式nnn. 在s編程中,一段好的與完美的間的差別之一,就是要熟知正則表達(dá)式并學(xué)會(huì)使用它們。相比較起來(lái),用一個(gè)命令抽取一段文本比用三四個(gè)命令得出同樣的結(jié)果要節(jié)省許多時(shí)間。既然已經(jīng)學(xué)會(huì)了正則表達(dá)式中經(jīng)常使用的基本特殊字符,又通過(guò)一些例子簡(jiǎn)化了其復(fù)雜操作,那么現(xiàn)在可以看一些真正的例程了。好,下面將講述大量的grep,sed和awk第8章 家相信grep是UNIX和LINUX中使用最廣泛令之一。grep(全局正則表達(dá)式版本)允許對(duì)文本文件進(jìn)行模式查找。如果找到匹配模式,grep打印包含模式的所有行。grep支持基本正則表達(dá)式,也支持其擴(kuò)展集。grep有三種變形,即: 擴(kuò)展grep,支持基本及擴(kuò)展的正則表達(dá)式,但不支持\q模式范圍的應(yīng)用,與之相Fgrep:快速grep。允許查找字符串而不是一個(gè)模式。不要誤解單詞fast,實(shí)際上它與在本章中討論實(shí)際上應(yīng)該只有一個(gè)grepgrep的三種變grepGNUgrep雖然在融合三種變形上邁進(jìn)了一大步,但仍不能區(qū)分元字符的基本集和擴(kuò)展集。上一章只討論了基本的正則表達(dá)式,但在查看grep時(shí)也涉及到一些擴(kuò)展模式的匹配操作。然而,首先還是先討論一下在grep和fgrep及egrep中均可使用的grep模式吧。開始討論之前,先生成一個(gè)文件,插入一段文本,并在每列后加入<Tab>鍵,grep命令示例中絕大多數(shù)將以此為例,其命名為data..f。生成一個(gè)文件,但不知其含義,將是一件很枯燥grep[選項(xiàng)]基本正則表達(dá)式[文件]在grep命令中輸入字符串參數(shù)時(shí),最好將其引號(hào)括起來(lái)。例如:“mystring”。這樣做有兩個(gè)原因,一是以防被誤解為s “jetne”,如果不引號(hào)將其括起來(lái),那么單詞ne將被誤認(rèn)為是一個(gè)文件,查詢結(jié)果將在調(diào)用變量時(shí),也應(yīng)該使引號(hào),諸如:grep“$MYVAR”文件名,如果不這樣,將-c-i不區(qū)分大小寫(只適用于單字符-h-l-n-s-v如果要在當(dāng) $grep"sort"*.doc$grep"sortit"$grep-c"48"data.現(xiàn)在顯示包含“48”字符串的4行文本:顯示所有不包含4848”,返回結(jié)果包含諸如484和483等包含“48”的其他字符串,實(shí)際上應(yīng)精確抽取只包含48的各行。注意在每個(gè)匹配模式中抽取字符串<Tab>表示點(diǎn)擊tab使用grep抽取精確匹配的一種更有效方式是在抽取字符串后加\>。假定現(xiàn)在精確抽取48,grep是大小寫敏感的,如要查詢大小寫不敏感字符串,必須使用-idata.f文件中有月份字符Sept,既有大寫也有小寫,要取得此字符串大小寫不敏感查詢,方法如下:使用正則表達(dá)式使模式匹配加入一些規(guī)則,因此可以在抽取信息中加入選擇。使用正則表達(dá)式時(shí)最好用單引號(hào)括起來(lái),這樣可以防止greps命令的特殊方式相。48,可以在方括號(hào)中使用^使用-i開關(guān)可以月份Sept的大小寫敏感,也可以用另式。這里使用[]模式抽取如果要抽取包含Sept483,可以使用管道命令,即符號(hào)“|”左邊命令的輸出作為“|”右邊命令的輸入。舉例如下:不必將文件名放在第二個(gè)grep命令中,因?yàn)槠漭斎胄畔?lái)自于第一個(gè)grep如果抽取以L開頭,以D結(jié)尾的所有代碼,可使用下述方法,因?yàn)橐阎a長(zhǎng)度為5將上述代碼做輕微改變,頭兩個(gè)是大寫字母,中間兩個(gè)任意,并以C一個(gè)常用的查詢模式是日期查詢。先查詢所有以開始以或結(jié)尾的所有記錄。使用模式5..199[6,8]。這意味著第一個(gè)字符為5,后跟兩個(gè)點(diǎn),接著是199,剩余兩個(gè)數(shù)字是6或查詢包含1998的所有記錄的另外法是使用表達(dá)式[0-9]\{3\}[8],含義是任意數(shù)字重這里返回很多信息,有想要的,也有不想要的。參照模式,返回結(jié)果是正確的,因此這^符號(hào):9有時(shí)要查詢重復(fù)出現(xiàn)次數(shù)在一定范圍內(nèi),比如數(shù)

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論