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