0

我需要识别分布在不同目录下许多文件中的 php 源代码中的所有查询。

我想使用 grep 和 MySQL 关键字来识别它们。有两种方法可以区分此源代码中的查询。

  1. 它们总是用双引号引起来。
  2. 它们将始终具有 MySQL 关键字,例如insertselect、和。updatedeletealter

但是有一个问题,双引号中的查询可以分布在多行中。例子 :

$newQuery = "Select username
             from 
             usertable"

所以我需要识别"Select username from usertable"

但是 grep 不能在多行上工作。

我试过 :

egrep -e '"(.*?)\+"' test.php | grep "select"

它适用于单行但又错过了多行查询。

所以我尝试了

sed -e '/\"/,/\"/!d' test.php

它返回所有查询,但我这样做了

sed -e '/\"/,/\"/!d' test.php | grep select

它返回,

"select 

这不好。我想我需要在 sed 中转义换行符。我如何实现这一目标?bash 的任何其他标准命令也可以,例如 awk。

4

2 回答 2

1

我经常使用perl -pe而不是sed一些更花哨的表达方式。

cat tmp.php | \
perl -pe "s/[\n\r\s]+/ /g" | \ # remove all spaces and line breaks
perl -e '$x=join " ", (<>); print join " ", ($x =~ /".*?(?:select|alter).*?"/gi)'

在最后一行中,您找到所有带select关键字的引号并将它们加入

于 2013-04-02T06:51:08.807 回答
1

使用 Perl 的一种方法:

perl -00ne 'print $1,"\n" while (/"((select|insert|update|delete|alter).*?)"/sig);' file

要在单行中获取输出:

perl -00ne 'while (/"((select|insert|update|delete|alter).*?)"/sig){$x=$1;$x=~s/\n//g;$x=~s/\s+/ /g;print "$x\n";};' file

要使用连接和拆分获得单行输出:

perl -00ne 'print join " ",split(/\s+/,$1),"\n" while (/"((select|insert|update|delete|alter).*?)"/sig);' file
于 2013-04-02T06:53:53.713 回答