如何透過 grep 取得 php 函數的參數?

如何透過 grep 取得 php 函數的參數?

我正在編寫一個腳本,讓我了解要遷移的伺服器上每個基於 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';

相關內容