2013-03-11 86 views
2

需要幫助使用bash腳本。我們正在修改我們的數據庫結構,問題是我們有許多帶有預先編寫的查詢引用當前數據庫結構的活動站點。我需要找到所有我們的腳本,並引用MySQL表。這裏是我開始:使用grep查找動態文本

grep -ir 'from' /var/www/sites/inspection.certifymyshop.com/ > resultsList.txt 

我想通過我們的腳本遞歸到grep和出口發現到一個文本文件中,我們可以使用所有的表名「 - >從」和「 - >加入」前綴幫助我們:

->from('databaseName.table_name dtn') // dtn = table alias 

OR

->join('databaseName.table_name dtn') // dtn = table alias 

我需要找到單引號(即databaseName.table_name)中的數據庫和表名。我還需要列出文件名,如下所示:

someDatabaseName.someTableName | /var/www/sites/blah.com/index.php |線36

+0

只是爲了更清楚:你想從像'線檢索所有'databaseName.table_name dtn' - >從( 'databaseName.table_name DTN')// DTN =表alias'和列表他們像'databaseName.table_n ame dtn | source_file | line_number',對嗎? – Rubens 2013-03-12 00:02:11

+0

這些引號內的任何內容都是動態的,「// dtn =表別名」只是我爲您的信息所做的評論,不在代碼內。所以它將是 - >(來自('databaseName.table_name dtn')和列表他們像你提到的。 – user2019528 2013-03-12 00:20:07

+0

我想我會做一些非常接近@sputnick指出的答案。 – Rubens 2013-03-12 00:33:18

回答

2

您只有使用grep時遇到的一個問題是從結果中刪除from,join或其他識別前綴。爲了解決這個問題,我們也可以用sed

grep -EHroi -- '->(from|join)\('\''[^'\'' ]*' /path/to/files | sed -re 's/:.*(from|join)\('\''/:/g' 

你也可以在一個單獨的使用sed的for循環

for i in `find /path/to/files -type f -print` 
do 
    echo $i 
    sed -nre 's/^.*->(from|join)\('\''([^'\'' ]*)['\'' ].*$/\2/gp' $i 
done 

編輯:以上爲用空格的文件名環路休息所以這裏使用以前的sed的聲明找到

find ./ -type f -exec sh -c "echo {} ; sed -nre 's/^.*->(from|join)\('\''([^'\'' ]*)['\'' ].*$/\2/gp' \"{}\" ;" \; 
+0

你的代碼將在文件名空白處失敗 – 2013-03-12 00:41:34

+0

@sputnick我已經用一個find語句編輯了文章,該語句與文件名中的空格一起工作。 – Eric 2013-03-12 01:07:44

+0

您輸入的第一條建議,grep和sed失敗。 -E是一個無效的選項,我在CentOS上。我刪除了-E並且離開了-e,現在我得到了:sed:-e表達式#1,字符23:不匹配(或者\( – user2019528 2013-03-12 23:03:59

3

嘗試這樣做:

grep -oPriHn -- "->(?:from|join)\('\K[^']+" . | 
    awk -F'[ :]' '{print $3, "|", $1, "| line " $2}' 

如果這符合你的需要,我可以解釋的片斷得更爲出色。

+0

嗨Sputnick,這不起作用,沒有找到從或不加入。我正在運行CentOS。 – user2019528 2013-03-13 17:48:34