2

需要有关 bash 脚本的帮助。我们正在修改我们的数据库结构,问题是我们有许多实时站点具有引用当前数据库结构的预写查询。我需要找到所有引用 MySQL 表的脚本。这是我开始的:

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

我正在尝试递归地遍历我们的脚本并将找到的所有表名导出到文本文件中,我们可以使用“->from”和“->join”前缀来帮助我们:

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

或者

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

我需要在单引号内找到数据库和表名(即databaseName.table_name)。我还需要列出在匹配项下方或旁边找到的文件名,如下所示:

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

4

2 回答 2

3

尝试这样做:

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

如果这符合您的需要,我也可以更多地解释该片段。

于 2013-03-12T00:02:31.040 回答
2

仅使用 grep 的一个问题是从结果中删除 from、join 或任何标识前缀。为了解决这个问题,我们还可以使用 sed

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

您也可以在 for 循环中单独使用 sed

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

编辑:上面的 for 循环用带空格的文件名中断,所以这是前面使用 find 的 sed 语句

find ./ -type f -exec sh -c "echo {} ; sed -nre 's/^.*->(from|join)\('\''([^'\'' ]*)['\'' ].*$/\2/gp' \"{}\" ;" \;
于 2013-03-12T00:15:35.393 回答