2013-04-02 75 views
0

我需要識別php源代碼中的所有查詢,這些查詢分佈在不同目錄下的許多文件中。使用grep查找源代碼中字符串中的所有查詢

我雖然關於使用grep和MySQL關鍵字來識別它們。有兩種方法可以區分這個源代碼中的查詢。

  1. 它們總是用雙引號加引號。
  2. 他們將始終擁有MySQL關鍵字,如insert,select,update,deletealter

但是有一個問題,雙引號內的查詢可以分成多行。例如:

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

回答

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 
+0

不能在測試文件上工作。遺漏了什麼? – user1263746

+0

它適用於您放置的示例片段。 「不工作」意味着沒有輸出,或輸出不符合預期? – Guru

+0

如果您仔細閱讀該問題,您會發現我嘗試的sed解決方案提供了與您的解決方案完全相同的輸出。但我需要單線而不是多線的結果。否則你的解決方案很簡單易懂。輸出應該是這樣的:「從usertable選擇用戶名」在一行中。謝謝! – user1263746

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關鍵字引號,並使用他們一起

+0

太棒了!我跳過了最後一個選擇部分,將所有輸出重定向到一個文件中,然後用所有關鍵字來擦除文件。它的完美,但我需要在所有文件上單獨執行此操作。 – user1263746

相關問題