unix中巧用文件比較命令提高系統(tǒng)管理效率

字號(hào):

Unix系統(tǒng)與Windows系統(tǒng)的區(qū)別就在于Unix系統(tǒng)是在一個(gè)個(gè)配置文件的基礎(chǔ)上建立起來的。故從這一點(diǎn)上來說,Unix系統(tǒng)工程師其工作的對(duì)象就是一個(gè)個(gè)Unix文件。如網(wǎng)絡(luò)IP地址配置、環(huán)境變量管理等等都可以通過相關(guān)的配置文件來實(shí)現(xiàn)。為此如何快速方便的來管理這些配置文件就是考驗(yàn)一個(gè)Unix系統(tǒng)工程師能力的問題。其實(shí)在Unix系統(tǒng)中提供了很多文件管理工具。若系統(tǒng)工程師能夠靈活應(yīng)用這些工具,那么就可以起到出奇制勝的效果。這不是筆者說大話,現(xiàn)在就以文件比較命令為例,談?wù)勅绾卫眠@些工具來提高系統(tǒng)管理效率。
    在日常工作中,與Unix操作系統(tǒng)進(jìn)行交互將占用系統(tǒng)工程師大部分的時(shí)間。系統(tǒng)工程師需要經(jīng)常切換目錄、顯示文件、編輯和編譯程序,并不斷的重復(fù)這些動(dòng)作。如果不合適的環(huán)境變量,會(huì)使得系統(tǒng)工程師苦不堪言。因?yàn)闉榱饲袚Q到合適的目錄就需要花費(fèi)他們很多的時(shí)間。為此像筆者這樣的有經(jīng)驗(yàn)的系統(tǒng)工程師,安裝完Unix操作系統(tǒng)之后,往往會(huì)根據(jù)自己的操作愛好來配置相關(guān)的環(huán)境變量,以提高后續(xù)系統(tǒng)維護(hù)的效率。這個(gè)環(huán)境變量不僅僅跟系統(tǒng)管理員的操作習(xí)慣有關(guān),而且還跟應(yīng)用程序的正常運(yùn)行相關(guān)。環(huán)境變量是包含關(guān)于系統(tǒng)及當(dāng)前登錄用戶的環(huán)境信息的字符串,一些軟件程序使用此信息確定在何處放置文件。如 path環(huán)境變量就是告訴操作系統(tǒng),當(dāng)要求系統(tǒng)運(yùn)行一個(gè)程序而沒有告訴它程序所在的完整路徑時(shí),系統(tǒng)除了在當(dāng)前目錄下面尋找此程序外,還應(yīng)到那些目錄下去找。如安裝完JDK軟件包之后,系統(tǒng)管理員還必須為其設(shè)置環(huán)境變量。否則的話,這個(gè)程序?qū)o法正常運(yùn)行??梢姯h(huán)境變量對(duì)系統(tǒng)工程師與應(yīng)用程序的重要性。
    但是如果一不小心對(duì)環(huán)境變量做了不合適的調(diào)整,則就會(huì)出現(xiàn)問題。如不小心更改了JDK軟件包的環(huán)境變量,那就會(huì)造成JAVA程序無法正常運(yùn)行,系統(tǒng)會(huì)提示找不到路徑。為此系統(tǒng)要能夠提供一種手段,能夠比較前后環(huán)境變量的異同。只有如此才能夠迅速的在數(shù)以百計(jì)的環(huán)境變量記錄中找到修改過的地方,并進(jìn)行調(diào)整。為了達(dá)到這個(gè)目的,就可以使用文件比較命令。如下圖:
    筆者會(huì)在安裝完Unix操作系統(tǒng)之后,就利用env命令顯示當(dāng)前操作系統(tǒng)的環(huán)境變量情況。然后利用重定向符號(hào)把顯示的結(jié)果保存在一個(gè)文件中( j假如是env1),以備以后比較使用。若一個(gè)月后筆者發(fā)現(xiàn)環(huán)境變量出現(xiàn)了點(diǎn)問題(如可能在這個(gè)時(shí)間段內(nèi)應(yīng)用程序修改過環(huán)境變量或者自己手工改過但是忘記了),筆者就會(huì)再次利用env命令把系統(tǒng)最新的環(huán)境變量重定向到一個(gè)文件中,假如是env2。然后筆者就可以利用cmp 命令來比較這兩個(gè)文件,找出其不同的地方。要實(shí)現(xiàn)這個(gè)目的,Unix系統(tǒng)中提供了比較多的文件比較命令。具體來說,有cmp、diff、comm三個(gè)命令可以完成這個(gè)任務(wù)。這三個(gè)命令各有各的特點(diǎn),系統(tǒng)工程師要學(xué)會(huì)根據(jù)自身的需求選擇合適的命令,以減少自己的工作量。
    一、判斷文件是否修改過。
    在Unix系統(tǒng)日常維護(hù)中,系統(tǒng)工程師經(jīng)常需要判斷兩個(gè)文件是否相同。如上面這個(gè)案例中,就需要判斷前后兩個(gè)環(huán)境變量文件是否相同。如果相同的話,則表明環(huán)境變量沒有更改過。如果有的話,則表明后來環(huán)境變量被人修改了。此時(shí)就可以采用cmp命令來進(jìn)行比較。這個(gè)命令會(huì)逐個(gè)字符的比較系統(tǒng)工程師指定的兩個(gè)文件。當(dāng)發(fā)現(xiàn)第一個(gè)不相同的字符時(shí),就會(huì)輸出其發(fā)現(xiàn)的位置。默認(rèn)情況下,cmp命令發(fā)現(xiàn)第一個(gè)不相同的字符后就會(huì)停止工作。除非系統(tǒng)工程師在使用這個(gè)命令的時(shí)候加入了-l參數(shù),系統(tǒng)才會(huì)列出詳細(xì)的列表,說明各個(gè)不相同的位置。不過對(duì)于系統(tǒng)工程師來說,往往只需要知道文件是被修改過即可。如果想知道到底哪里被修改了,則需要使用其它的命令來完成。
    在使用這個(gè)命令的時(shí)候,筆者認(rèn)為系統(tǒng)工程師需要注意二個(gè)問題。如上圖中,如果文件env1與文件env2完全相同的話,則系統(tǒng)不會(huì)反映任何信息,直接返回到提示符。這就是Unix操作系統(tǒng)的“無響應(yīng)方式”。這看起來好像是沒有返回結(jié)果信息,其實(shí)不是這樣。如果兩個(gè)文件相同的話,則系統(tǒng)會(huì)返回一個(gè)true的值。當(dāng)在shell程序開發(fā)時(shí)這個(gè)值非常的重要。因?yàn)檫@個(gè)值可以在腳本程序里作為條件語句用于控制程序的流程。另外就是這個(gè)命令只顯示字符不同的位置,但是并不會(huì)顯示到底有哪里不同。通常情況下,筆者都是先利用這個(gè)命令來判斷先后兩個(gè)文件是否不同。如果發(fā)現(xiàn)不同的話,再通過后面兩個(gè)命令來查找到底有哪里不同。
    二、找出具體的差異。
    通常情況下,判斷文件(環(huán)境變量)是否存在不同只是系統(tǒng)工程師的第一步。如果發(fā)現(xiàn)有不同的話,則還需要查詢到底有哪里不同。為了達(dá)到這個(gè)目的,就需要采用comm命令或者diff命令。
    如現(xiàn)在有兩個(gè)文件,分別記錄著不同時(shí)期的環(huán)境變量情況?,F(xiàn)在系統(tǒng)工程師想找出一個(gè)表中沒有的記錄而在另一個(gè)文件中存在的記錄名字;或者想找出前后兩個(gè)時(shí)期環(huán)境變量沒有更改過的記錄。為了實(shí)現(xiàn)這個(gè)目的,則comm命令就能夠解決這個(gè)問題。只需要輸入comm env1 env2命令,則系統(tǒng)就會(huì)輸出結(jié)果。在輸出列表中,會(huì)把兩個(gè)文件的不同之處和相同之處說得非常清楚。其中第1列的內(nèi)容表示前面一個(gè)文件獨(dú)有的;第2列中的內(nèi)容表示后面一個(gè)文件獨(dú)有的;第三列中的內(nèi)容則表示兩個(gè)文件共有的。為此系統(tǒng)工程師可以根據(jù)自己的需要查看不同列的內(nèi)容。如想了解前后兩次環(huán)境變量沒有更改過的內(nèi)容(即前后兩個(gè)文件都相同的記錄),則可以看第三列的內(nèi)容。如想查看后來環(huán)境變量更改過的信息,則可以查看第一、二列中的內(nèi)容。
    另外還可以通過diff文件來找到連個(gè)文件的差異點(diǎn)。不過與前面兩個(gè)命令不同,這個(gè)第diff命令顯示的結(jié)果更加具體。這個(gè)命令除了會(huì)顯示兩個(gè)文件不同的地方之外,還會(huì)給系統(tǒng)管理員一些提示,表明修改一個(gè)文件中的哪些內(nèi)容可以使得兩個(gè)文件內(nèi)容相同。如果比較的兩個(gè)文件內(nèi)容相同,則會(huì)顯示詳細(xì)信息。
    在輸出的結(jié)果中,diff會(huì)用一些特殊符號(hào)或者指令來表示執(zhí)行哪些更改能夠使得兩個(gè)文件相同。這有利于系統(tǒng)工程師找出前后兩個(gè)文件的具體差異點(diǎn)。當(dāng)系統(tǒng)工程師可以確定后面一個(gè)記錄有問題,就可以直接根據(jù)提示來進(jìn)行更改。故當(dāng)系統(tǒng)工程師確定要更改(如想實(shí)現(xiàn)前后環(huán)境變量一致),則可以直接使用這個(gè)命令。
    另外Unix操作系統(tǒng)中有一個(gè)sed使用工具,也需要用到這個(gè)diff命令的結(jié)果。sed 實(shí)用工具是就好像一個(gè)編輯器,但它與其它大多數(shù)編輯器不同。它有連個(gè)很重要的特性,即不面向屏幕之外和非交互式的特性。這也就意味著系統(tǒng)工程師必須將要對(duì)數(shù)據(jù)執(zhí)行的命令插入到命令行或要處理的腳本文件中。sed 在一個(gè)文件或文件集中非交互式、并且不加詢問地接收一系列的命令并執(zhí)行它們。所以它流經(jīng)文本就如同水流經(jīng)溪流一樣。如通過這個(gè)命令可以實(shí)現(xiàn)Word等編輯器中的替換功能。如它可以用來將所有出現(xiàn)的“A”修改為“B”。當(dāng)然其作用遠(yuǎn)遠(yuǎn)不止替換這么簡單。這個(gè)se 流編輯器非常適合于執(zhí)行重復(fù)的編輯,這種重復(fù)編輯如果由人工完成將花費(fèi)大量的時(shí)間。其參數(shù)可能和一次性使用一個(gè)簡單的操作所需的參數(shù)一樣有限,或者和一個(gè)具有成千上萬行要進(jìn)行編輯修改的腳本文件一樣復(fù)雜。系統(tǒng)工程師在使用Sed編輯器時(shí)也需要用到diff顯示結(jié)果中的符號(hào)信息。故雖然diff顯示的結(jié)果有點(diǎn)復(fù)雜,但是系統(tǒng)工程師還是需要花一番時(shí)間去吃透它。