
我正在編寫一個腳本,讓我了解要遷移的伺服器上每個基於 PHP 的網站的資料庫登入資訊。登入資訊通常是這樣完成的:
$servername='localhost';
$database_username='someName';
$database_password='p@ssw0rd';
$database_name='someDatabase';
mysql_connect($servername, $database_username, $database_password);
mysql_select_db($database_name);
或者像這樣:
$pdo = new PDO("mysql: host={$servername}; dbname={$$database_name}", $database_username, $database_password);
該腳本正在搜尋包含 PHP 連接函數之一的每一行:
grep -irE "mysql_connect\|mysql_select_db\|new PDO" *
現在,如何取得$
以非字母數字開頭和結尾的每個字串?此外,如果;
螢幕上沒有找到字符,我希望收到通知,以便我可以手動處理它,因為某些編碼員可能會這樣做:
$pdo = new PDO("mysql: host={$servername};
dbname={$$database_name}",
$database_username,
$database_password
);
獲得這些標記(PHP 變數)後,我將再次 grep 檔案查找標記,希望獲得它們的值;
答案1
我不太確定你在這裡想做什麼,但你可以用以下方法「以非字母數字字元grep
開頭和結尾的所有字串」:$
grep -oP '\$.+?\W'
為了回應你的評論,像這樣的事情怎麼樣:
for f in `find . -name "*.php"`; do \
echo "----- $f -----";
for s in $(grep -iE "mysql_connect|mysql_select_db|new PDO" $f |
grep -oP '\$\w+?\W' | sed 's/.$//' | sort | uniq); do \
grep -m 1 $s $f;
done;
done
此 scriptlet 將查找所有 .php 文件,對每個文件進行 grep 查找您感興趣的變量,然後列印找到的文件中每個變量的第一個aa.php
實例bb.php
。它們的內容是:
$ cat aa.php
$servername='localhost';
$database_username='someName';
$database_password='p@ssw0rd';
$database_name='someDatabase';
mysql_connect($servername, $database_username, $database_password);
mysql_select_db($database_name);
$ cat bb.php
$servername='localhost2';
$database_username='some2Name';
$database_password='p@ssw0rd2';
$database_name='someDatabase2';
$pdo = new PDO("mysql: host={$servername}; dbname={$$database_name}", $database_username, $database_password);
上面腳本的輸出是:
----- ./bb.php -----
$database_name='someDatabase2';
$database_password='p@ssw0rd2';
$database_username='some2Name';
$pdo = new PDO("mysql: host={$servername}; dbname={$$database_name}", $database_username, $database_password);
$servername='localhost2';
----- ./aa.php -----
$database_name='someDatabase';
$database_password='p@ssw0rd';
$database_username='someName';
$servername='localhost';