使用grep在源代码中查找字符串中的所有查询

时间:2013-04-02 06:37:10

标签: regex linux bash grep pattern-matching

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

我虽然使用grep和MySQL关键字来识别它们。我可以通过两种方式区分此源代码中的查询。

  1. 它们总是用双引号引用。
  2. 他们将始终拥有MySQL关键字,例如insertselectupdatedeletealter
  3. 但是有一个问题,双引号中的查询可以分散在多行中。示例:

    $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。

2 个答案:

答案 0 :(得分: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关键字的所有引号并加入

答案 1 :(得分: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

使用join和split获得单行输出:

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