2013-03-11 32 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