如何通过 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 查找您感兴趣的变量,然后打印找到的文件中每个变量的第一个实例。例如,我创建了 2 个 .php 文件,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';

相关内容