shell腳本自動查找指定路徑下包含某關鍵字的所有文件

    這個腳本是用來查找指定路徑下,含有某個關鍵字的所有文件,並顯示文件所在路徑及文名。

    起初是因爲上週幫同事解決linux下JBoss服務器驗證碼失效的問題,而引發的“血案”,哈哈,其實是,JBoss服務器的web頁面的驗證碼再每次重啓之後運行一段時間就不聲不響地失效了,顯示小紅X,但一重啓JBoss就會好用一陣子,從疑雲重生,無所適從,峯迴路轉到真相大白,經過一中午的探查與研究,找出破解此案的重要線索JAVA_OPTS這個環境變量,加上-Djava.awt.headless=true這個參數就可以解決驗證碼時而失效的問題了。
    當時查找JAVA_OPTS環境變量在那個配置文件時,我用的是find命令查找$JBOSS_HOME路徑下的conf文件,雖然很快找到了我要的文件,但我覺得這滿足不了我“強迫症”的習慣。因此事後,我決定寫個腳本來查找指定路徑下包含某關鍵字的所有文件,開始是寫成非交互式的shell腳本,後因一位本站志同道合的朋友說,如果寫成交互式的,即運行時給變量賦值,這樣一勞永逸,無需改代碼。後來仔細琢磨了一下,也不無道理,儘管我有自己的編碼風格,但還是廣納賢言吧,哈哈。
    此腳本爲最終腳本:
   
  1. #!/bin/bash 
  2. #find files contains a keyword 
  3. #write by xiaojing.zhao 
  4. #2012.12.14 
  5.  
  6. echo -e "\nThis is a script to find all the files in a specified path contains a keyword!" 
  7.  
  8. echo -e "\nPlease input a keyword:" 
  9. read key 
  10. if [ "$key" == "" ]; then 
  11.     echo -e "keyword can not be null!\n" 
  12.     exit 0 
  13. fi 
  14. keyword=$key 
  15.  
  16. echo -e "\nPlease input your specified path:" 
  17. read dir 
  18. #判斷該路徑是否存在,並且是目錄,不存在輸出提示 
  19. test ! -d $dir && echo -e "The $dir is not exist in your system.\n\n" && exit 0 
  20.  
  21. echo -e "\n---------------You find files are:---------------\n" 
  22.  
  23. #keyword=JAVA_OPTS 
  24. #dir=/jboss/jboss-eap-4.3/jboss-as/ 
  25.  
  26. #統計文件個數 
  27. file_count=0 
  28. #遞歸查看所有目錄,即最深路徑,不顯示空行 
  29. file_list=`ls -R $dir 2> /dev/null | grep -v '^$'
  30. for file_name in $file_list 
  31. do 
  32.     #臨時文件變量temp,將ls -R即file_list中的文件名中所有匹配:後接一個或多個任意字符(.代表任意字符,*代表0個或多個$代表行尾結束符)全局替換爲無 
  33.     #簡單的說,就是把file_name變量中的匹配:的行,將:後內容替換爲空 
  34.     temp=`echo $file_name | sed 's/:.*$//g'
  35.     #如果臨時文件變量temp是一個目錄,而非文件,就將該目錄賦值給cur_dir變量 
  36.     if [ "$file_name" != "$temp" ]; then 
  37.         cur_dir=$temp 
  38.         #echo "-"$cur_dir #臨時顯示,調試用 
  39.     else 
  40.         #用file命令查看文件真身是否爲ASCII text類型 
  41.         file_type=`file $cur_dir/$file_name | grep "text"
  42.         if [ "$file_type" != "" ]; then 
  43.             temp=`grep $keyword $cur_dir/$file_name 2> /dev/null` 
  44.             #echo "--"$cur_dir/$file_name #臨時顯示,調試用 
  45.             if [ "$temp" != "" ]; then 
  46.                 echo $cur_dir/$file_name 
  47.                 #文件個數加1 
  48.                 let file_count++ 
  49.             fi 
  50.         fi 
  51.     fi 
  52. done 
  53.  
  54. echo -e "\n-------------------------------------------------" 
  55. echo -e "\n\nFiles Total: $file_count" 
  56. echo -e "\nFind Finished!\n" 
運行效果如下:
這是我用來寫腳本做實驗的效果,其中“cmd”爲關鍵字,/tmp爲指定路徑,然後什麼t.c啊,test.txt,file系列都是我echo cmd > 丟進去的,以便模擬我要的環境。

這纔是我寫腳本的真正目的,爲了查找我要的環境變量JAVA_OPTS,效果如下:

輸入keyword和path,即可幫我找到我要的文件,其中紅框框的就是我要的

這就是run.conf配置文件裏的JAVA_OPTS變量,而-Djava.awt.headless=true就是使驗證碼正確顯示的關鍵參數。特此記下偵破此案的關鍵證據。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章