Unix的輕巧“約取而實得”(中篇)

Unix的輕巧“約取而實得”(中篇)
 
                               三、與查找比較相關的命令
 
     使用Windows系統的用戶可能都有這樣的經歷,在網上看到可悠長品賞的電影,down;看到匠心獨運的電子書,down;看到妙織錦繡的文章,down;看到銜華佩實的資料,down。但時間一長,想再回顧一下《星戰前傳3:西斯的反擊》中奧比旺和阿納金在熔岩橫流的穆斯塔法星上展開光劍對決的精彩片段,或者是重溫一下李開復先生給中國學生第四封信中所提出在大學校園應當掌握的“七項學習”,可能自己都記不清當時是放在哪個目錄裏了。幸好,Windows爲我們提供了“搜索”功能,再加上現今Google、百度相繼推出的Google 桌面搜索、百度硬盤搜索,才使得這些文件倖免於藏身深宮大院之中,煢煢孑立、形影相弔的命運。那麼在Unix系統中的文件又是怎樣的命運呢?且看以下的命令功能:
 
  (一)利用find命令查找文件
     find命令的功能是在指定目錄及其子目錄下查找符合條件的文件,命令格式如下:
         find path expression
參數path指欲開始查找的起始目錄,find會遍尋此目錄以及其子目錄,並且此參數可以有多個目錄名稱,只要在目錄與目錄之間用空格分開即可。參數expression指明瞭諸如基於文件名、文件類型、文件所有者、最後一次修改時間等的查找規則,find命令將遵循此查找規則來查詢指定目錄以及子目錄中的文件。
    常用的查找規則如下:

-name filename
指定要尋找的文件或目錄名稱
-print
將搜索到的符合條件結果以包含路徑名的方式輸出
-type x
以文件類型作爲尋找條件,常用的文件類型x如下:
d --- 目錄文件,  f --- 普通文件,  b --- 塊設備文件, c --- 字符設備文件,  l --- 鏈接文件
-user user
尋找用戶user所擁有的文件,user可爲用戶名或uid號
-atime n
尋找n天之前曾被訪問過的文件
-mtime n
尋找n天之前曾被修改過的文件
-exec command {}/;
用尋找到的文件作爲執行command的對象,{}中保存執行command時所需的參數,注意必須以 /; 爲結束
 
     下面來看一些具體的查找實例:
     [例1] 在目錄/home中查找名爲javac的文件,並要顯示出完整的路徑名:
           find /home –name javac -print
     [例2] 在當前目錄下查找以doc開頭,7天之前曾被修改過的文件:
           find . –name “doc*” -mtime 7
     [例3] 在目錄/home中查找名爲anray的目錄,並顯示出完整的路徑:
           find /home –name anray –type d -print
     [例4] 在目錄/home中查找用戶zcl所擁有的普通文件,並將其刪除:
           find /home –type f –user zcl -exec rm {} /;
 
     (二)使用grep命令查找字符串
     使用grep命令在文本文件中查找指定的字符串,並將所有出現該字符串的行打印顯示出來。grep命令的格式如下:
         grep [-iv] 字符串 文件名
參數i代表查找字符串時忽略字母大小寫,參數v顯示出所有不包含指定字符串的行。如果在欲查找的字符串中包含有空格,那麼應該用單引號將此字符串引起來。此外,如果是想同時在多個文件中查找指定的字符串,那麼只需列出所有欲搜索的文件即可,這樣grep命令會在所列出的匹配行前加上文件名。grep常與通配符、管道符一起搭配使用,這樣可以實現一些特殊的查找功能,大家應能結合上面所介紹的命令來綜合應用。
  [例1] 在文件file1中查找字符串“Java Web”,並忽略大小寫。
            grep –i ‘Java Web’ file1
       或   cat file1 | grep –i ‘Java Web’
       或   grep –i ‘Java Web’ < file1
  [例2] 在當前目錄中查找5月1日創建或修改過的文件。
               ls –la | grep –i ‘may 1’
 
     (三)比較兩個文件的內容
     在Windows系統中,不知你是否用過一款名爲WinMerge的軟件?此款軟件一項非常強悍的功能,就是可以比較兩個文件的內容有哪些不同之處,而且可謂是火眼金睛。記得筆者讀研一的時候,聽一位助教說他就是靠這款軟件逮了不少抄襲作業的人:)而在Unix系統中,則無需藉助第三方軟件就可實現此項功能了。cmp命令可用於比較兩個文件,這兩個文件可以是文本文件也可以是非文本文件。在默認情況下,cmp命令會顯示兩個文件第一次數據不同的位置;若兩個文件內容相同,則不顯示任何信息。cmp命令的格式如下:
         cmp  [-l]  文件名1  文件名2
參數l代表標示出每個不同之處內容的行號。
     另外,還可以使用diff命令來比較兩個文本文件或目錄的不同之處,它會詳細的列出文件1比文件2增多的內容、減少的內容以及改變了的內容。diff命令的格式如下:
         diff [-r] 文件1 文件2     //如果比較兩個目錄的不同之處,加上參數r
在得到的結果中,d表示文件1比文件2增多的內容,a表示文件1比文件2減少的內容,c表示文件1較文件2改變了的內容。
 
     (四)使用wc命令進行統計
     大家一看到wc這個詞,不知道是否會產生方便的感覺,呵呵。在Unix系統中,wc可是個非常有用的命令。對於Word中的字數統計功能,大家應該非常熟悉,利用它可以統計出一篇文章中的頁數、字數、字符數、行數等信息。而wc命令也同樣實現了類似於Word的字數統計的功能,它把一個文件作爲數據流讀入,然後計算出此文件中的行數、單詞數以及字符數,並輸出這些統計數據。wc命令的格式如下:
         wc [-lwc] filename(s)
參數l代表統計行數,參數w代表統計字數,參數c代表統計字符數。
       wc -l file1 file2    //統計文件file1和file2 的行數
       grep wang /etc/passwd | wc –l   //統計目錄/etc下的passwd文件中有多少個用戶名爲wang的用戶
 
                                四、文件歸檔及壓縮命令
 
     (一)文件歸檔命令
     用戶在處理文件過程中,有時需要對某些目錄及文件進行打包備份的操作,或有時需要將幾個文件組合成一個文件以便於網絡傳送,就像減肥瘦身了的五、六個美女擠坐一輛出租車一樣,這時Unix系統提供的tar命令就能有用武之地了。使用tar 命令,可以將多個文件或目錄合併成爲一個tar包以便於存儲及傳輸。tar命令的常用格式是:
    tar cvf filename.tar file1 file2 …directory1 directory2 …
此處參數中c表示創建一個新的歸檔,v表示啓動顯示模式,tar會顯示出所處理的每個文件名,f filename.tar表示使用指定的文件名作爲歸檔文件。
  如:要將/home/zcl/down目錄中的文件全部歸檔爲down.tar,可以使用如下命令
          tar cvf down..tar /home/zcl/down
  當用戶想把已歸檔的文件復原,則可使用如下的命令格式:
          tar xvf filename.tar
 
     (二)文件壓縮命令
  爲了避免文件佔用太多的磁盤空間,用戶會選擇將文件壓縮存放。通常壓縮會和歸檔組合使用,使用戶能夠對整個目錄以及目錄中的文件同時進行壓縮。對許多Windows用戶來說,使用Winzip、Winrar等工具軟件來壓縮或解壓文件是很平常的事,那麼如何在Unix系統中對文件進行壓縮與解壓呢?下面介紹Unix系統中常用的三種壓縮類型以及解壓縮命令。
     1、使用gzip/gunzip 命令解壓縮文件
  使用gzip命令壓縮後的文件名稱爲“原文件名.gz”,它對應的解壓命令是gunzip。命令格式如下:
          gzip filename
          gunzip filename.gz
  如:要largefile.tar文件壓縮成爲largefile.tar.gz,則可以使用如下命令
     gzip largefile.tar
  如果要把largefile.tar.gz解壓,則只需使用命令gunzip largefile.tar.gz即可。
 
     2、使用compress/ uncompress命令解壓縮文件
     凡是經過compress命令壓縮處理的文件,會在文件名後附加上“.Z”,它對應的解壓命令是uncompress。命令格式如下:
     compress filename
     uncompress filename.Z
 
     3、使用pack/unpack命令解壓縮文件
     凡是經過pack命令壓縮處理的文件,會在文件名後附加上“.z”,它對應的解壓命令是unpack。命令格式如下:
           pack –f filename
      unpack filename.z
 
                                 五、進程管理與控制命令
 
     “進程”顧名思義就是“正在進行着的程序”,在Unix系統中一個進程可視爲一項正在執行的任務,這樣一個命令也就是一個進程了。Unix系統具有檢查和控制進程的相關命令,它們常被用於管理Unix系統。事實上,進程不僅包括用戶所執行的命令,也包括了維持Unix系統正常運行的所有程序,且每一進程都有其唯一的代號,即進程標識符。
     要想查看系統當前正在運行的進程信息,可使用命令:
           ps [-options]    //無參數時只顯示當前用戶在當前窗口中所運行的進程
                            //如果系統提示ps爲非法命令,則在csh中可使用/usr/bin/ps,
                                   //bash中可使用/usr/ucb/ps來替代ps
     

參數
解釋
-e
列出所有正在運行的進程
-f
長列表顯示進程的細節信息,一般與e一起使用
-u 用戶名
顯示指定用戶正在運行的進程
 
  如:要求長列表顯示所有與用戶zcl相關的進程信息,命令如下:
          ps –ef | grep zcl
     此外,如果想要查看進程佔用系統資源的情況,可使用如下的兩個命令:
          /usr/ucb/ps –auwx    //查看進程佔CPU、內存等系統資源的情況
          prstat              //時時刷新當前系統的進程信息,並按所佔系統資源大小排列
 
     在某種特殊情況下,用戶可能會無法正常的結束某一進程,這時就需要使用命令kill來殺掉這一進程,不過要注意的是用戶只能殺掉由其自身創建的進程。命令格式如下:
          kill [-signal] process-id
  或
          pkill [-signal] process-name
kill就像一名狙擊手,實施的是精確的“點殺”,kill會精確的殺掉指定進程號的進程,如:
          kill 12345    //“點殺”進程號爲12345的進程,進程號可利用ps命令查出
          kill -9 12480  //-9代表強制殺掉進程,但不會清理該進程所佔的資源
pkill就像一名機槍手,實施的是威力巨大的“羣殺”,pkill會殺掉所有指定的進程名的進程。如:
        pkill sleep  //殺掉系統中所有名爲sleep的進程
     這裏,我們再引入一個新的概念——作業。作業這一概念只有在需要對進程區分爲前後臺時方被使用,它等同於進程的概念。前臺進程是指可以和用戶直接進行人機交互的進程,它可以接收鍵盤輸入並將結果顯示在顯示器上。缺省狀態下用戶啓動的Unix程序都運行在前臺。後臺進程是指不直接和用戶進行交互的進程,用戶一般是感覺不到後臺進程的運行。要讓某一程序在後臺運行,只需在命令行的最後加上“&”符號。在Unix系統中可以同時在前臺和後臺運行多個進程,通常情況下,一般把需要和用戶交互的程序放在前臺執行,而把不需要以交互方式執行的程序置於後臺運行。
     使用jobs命令可以查看當前系統中正在執行的作業,如下圖所示:
在圖中,“[]”中的數字代表作業號,此作業號可以配合作業管理命令一起使用:
 

fg %n
將某一作業放入前臺運行(n代表作業號,下同)
bg %n
將某一作業放入後臺運行
stop %n
掛起後臺某一作業
kill %n
終止某一指定的作業
 
  此外,還應掌握三個常用的鍵盤指令:
 

Ctrl + z
掛起前臺正在運行的作業
Ctrl + d
正常的結束前臺作業,即先執行完該進程後結束
Ctrl + c
終止前臺作業(非正常方式)
 
  如:
  [例1] 要求後臺運行find命令,在當前目錄及其子目錄下查找文件名前綴爲file的文件。
     解:通常當在後臺運行命令時,最好將其運行結果輸出重定向到一個文件中,以便日後檢查或校對。因此,此題可以使用如下的命令:
          find . -name “file*” >myfind &
這樣,我們就可以通過查看myfind文件來查看查找結果了。在運行此命令的同時,我們還可以繼續輸入其它命令來進行其它操作。
 
  [例2] 要求前臺運行find命令,在當前目錄及其子目錄下查找文件名前綴爲file的文件,運行過程中掛起進程,並將其放入後臺運行。
     解:此題可以使用如下的命令:
          find . -name “file*” >myfind
          ^z  (按Ctrl + z)
          jobs    //通過jobs命令來查看find進程的作業號,假設爲1
          bg %1
 
     這裏再補充與記取一個小知識點,即當在前臺殺掉某一進程後,那麼此進程的所有子進程都會同時被殺掉;而如果是在後臺殺掉某一進程,那麼此進程的所有子進程都將“過繼”給“祖宗”進程(即進程號爲1的進程)而繼續運行。
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章