2

bash スクリプトのヘルプが必要です。データベース構造を変更しています。問題は、現在のデータベース構造を参照する事前に作成されたクエリを持つ多くのライブ サイトがあることです。MySQL テーブルへの参照を含むすべてのスクリプトを見つける必要があります。これが私が始めたものです:

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

スクリプトを再帰的に grep し、見つかったすべてのテーブル名をテキスト ファイルにエクスポートしようとしています。"->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 のみを使用する場合に発生する問題の 1 つは、結果から 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 に答える