緣於一位網友的問題,我做了整理放上來……
————————————————————————————————————————————
一般我喜歡協助別人解決問題,然後讓自己感覺到很有成就感;這種想法是不是有點……哈哈,我就是這樣,我比較喜歡看別人的問題,然後盡努力去協助他。所以,經常有很多的網友來問我一些問題。時間長了,問題也就多了。我覺得應該把這個東西積累下來。所以想以部落格的形式放出來,一方面,自己以後忘了可以再來看看;另一方面,希望幫到更多的朋友。
緊緊是個人看法,如果有不同意見的,可以評論留言,勿噴!謝謝~
下面來說一說一位來自群裡的網友的提問;
web伺服器下面的一個設定檔wp-config.php,在/var/www/目錄下的好幾個子目錄裡都有,裡面的內容也不盡相同,現在想要修改這些設定檔都有的一行
/**MySQLdatabasepassword*/
define('DB_PASSWORD','GgEv!&C2rsDsdfEWayAz');
把後面單引號裡面的內容也就是DB_PASSWORD這個資料庫的密碼修改為指定的字串。
是/var/www/目錄下所有名稱為wp-config.php的檔案都要修改
好,碰到這個問題呢,身為菜鳥的我,在老師的教導下,遵循了三個基本原則;
1.首先建立測試檔案;
2.其次測試資料處理;
3.真正處理檔案;
好,開啟準備好的虛擬機器;CentOS6.4系統
[root@Jason64-17 ~]# cat /etc/redhat-releaseCentOS release 6.4 (Final)
查看建立好的測試檔案;
[root@Jason64-17 ~]# ls wp-config -l-rw-r--r-- 1 root root 32 Oct 8 14:02 wp-config
建立批量複製指令碼;
我自己寫的批量copy指令碼,覺得不是很滿意,大家如果有好的,可以送上來。嘻嘻~】
[root@Jason64-17 ~]# cat cp.sh#!/bin/bash#program# this program help you copy file to wherever you want#history#09/28/13 lisp first release#read -p "Please input filename i will cp it to everywhere: " filename[ "$filename" == "" ] && echo "you must input filename! " && exit 1for i in $@docp $filename $idone
將其批量複製到多個目錄下
[root@Jason64-17 ~]# sh cp.sh /var/www/html/ /var/www/ /var/www/2/Please input filename i will cp it to everywhere: wp-config.php[root@Jason64-17 ~]# find /var/www/ -type f -name wp-config.php/var/www/html/wp-config.php/var/www/2/wp-config.php/var/www/wp-config.php
測試資料處理
查看要處理的資料;
[root@Jason64-17 ~]# nl wp-config.php1 <?php2 /**3 * The base configurations of the WordPress.4 *……omitting……21 /** MySQL database password */22 define('DB_PASSWORD', 'GgEv!&C2rsDsdfEWayAz');……omitting……
利用sed進行資料處理測試;
[root@Jason64-17 ~]# sed -n 's/\(PASSWORD....\).*\(..;\)/\1123456\2/gp' wp-config.phpdefine('DB_PASSWORD', '123456');
或者
[root@Jason64-17 ~]# sed -n "s/PASSWORD', '.*'/PASSWORD', '123456'/gp" wp-config.phpdefine('DB_PASSWORD', '123456');
在這裡要和大家說的就是,使用sed一般我們都是使用hard quote來放在sg的兩個肩膀上,但是如果我們要替換的內容裡面有單引號(hard quote)呢?
有兩種方法(目前我想到的),一種是要麼避開它,一種是要麼就是直接“面對”它。
第一種就是逃避的方式,我們用\(\)本機覆寫,將單引號悄悄的括起來了,它也就沒什麼話可說了。
第二種就是所謂的在外面使用雙引號(softquote),那麼你裡面的單引號就可以暢行無阻了……。
那為什麼單引號裡面就不能再次使用單引號了呢?
我的理解是,sed語句執行的時候,判斷開始的執行條件符號是單引號,那麼在執行的過程中再次碰到的單引號它將作為結束來處理(轉義根本沒用),如果再次碰到單引號,那麼它又會以開始來判斷,所以你寫完語句的時候,在寫後面的資料流的源檔案的時候試試Tab鍵,它沒反應,就是因為sed還沒有結束標識,所以預設現在還不是shell的命令,所以Tab是沒用的。只有你寫了完整的起始和結束標識符,你Tab的時候才會補全檔案名稱。
PS:這個也可以作為判斷你的sed語句是否寫的正確,如果按了半天的Tab,沒有補全功能,那說明你的命令是有問題的;awk也是如此哦!】
好了,關鍵的一步我們搞定了以後,接下來的就小菜一碟啦!
使用find尋找出我們要修改的檔案
[root@Jason64-17 ~]# find /var/www/ -type f -name wp-config.php/var/www/html/wp-config.php/var/www/2/wp-config.php/var/www/wp-config.php
這其實就是我剛剛操作的命令,再執行一次,查看有哪些檔案)
結合管道利用sed的資料處理功能來對找出來的檔案依次修改測試環節】
[root@Jason64-17 ~]# find /var/www/ -type f -name wp-config.php | xargs sed -n "s/PASSWORD', '.*'/PASSWORD', '123456'/gp"define('DB_PASSWORD', '123456');define('DB_PASSWORD', '123456');define('DB_PASSWORD', '123456');[root@Jason64-17 ~]#
查看測試結果滿意了以後,再使用sed-i參數直接對檔案進行修改;
[root@Jason64-17 ~]# find /var/www/ -type f -name wp-config.php | xargs sed -i "s/PASSWORD', '.*'/PASSWORD', '123456'/g"[root@Jason64-17 ~]# find /var/www/ -type f -name wp-config.php | xargs grep PASSWORD/var/www/html/wp-config.php:define('DB_PASSWORD', '123456');/var/www/2/wp-config.php:define('DB_PASSWORD', '123456');/var/www/wp-config.php:define('DB_PASSWORD', '123456');[root@Jason64-17 ~]#
這裡要注意xargs的用法;有些朋友會問:grep和sed不是支援管道嗎?怎麼還要加xargs呢?
因為,如果不加xargs,那麼sed和grep都是對搜尋出來的檔案名稱進行處理了,而不是對檔案裡面的內容。加了xargs,那麼xargs就會將上個命令的結果,作為參數依次傳遞給下個命令使用。當然有些命令是不支援管道的,因而要加xargs處理一下。
好了,問題此時到這裡呢,就基本上已經解決了。
解決這個問題,用到了很多的知識;有find、sed、grep、xargs、還有shell指令碼等。收穫不小啊~哈哈!
也希望大家多多給建議,這篇文章哪裡寫的不好的,還忘指正。
對了,對於上述有些命令的用法,有不懂的可以自行尋找資料,還可以QQ私聊我哦,有空的話我會及時給你回複的;我的QQ:1031239088。
總之,就是想大家一起進步嘛!
本文出自 “lisp的營運之路” 部落格,請務必保留此出處http://lspgyy.blog.51cto.com/5264172/1303255