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

ИЛИ

->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») д.т.н. // ЦТС = таблица alias' и список они похожи на 'databaseName.table_n ame dtn | source_file | line_number', правильно? – Rubens

+0

что-либо внутри этих кавычек будет динамическим, а псевдоним «// dtn = table» - это просто комментарий, который я сделал для вашей информации, которая не входит в код. Таким образом, это будет -> from ('databaseName.table_name dtn') и список, как вы упомянули. – user2019528

+0

Думаю, я бы сделал что-то очень близкое к тому, что @sputnick указал в его ответе. – Rubens

ответ

2

Единственная проблема, с которой вы столкнулись только при использовании grep, заключается в удалении из, присоединения или любого другого идентификационного префикса. Чтобы исправить это, мы также можем использовать СЭД

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

Вы также можете использовать СЭД в одиночку в цикле

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

Edit: выше разрывов контура с именами файлов с пробелами, так вот предыдущий СЭД заявление с использованием найти

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

Ваш код будет сбой на пробелах в именах файлов –

+0

@sputnick Я отредактировал сообщение с оператором find, который работает с пробелами в именах файлов. – Eric

+0

первое предложение, которое вы набрали, с grep и sed терпит неудачу. -E - недопустимый вариант, я на CentOS. Я удалил -E и оставил -e, и теперь получаю: sed: -e выражение # 1, char 23: Unmatched (или \ ( – user2019528

3

Попробуйте сделать это:

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

Если это соответствует вашим потребностям, я могу объяснить фрагмент кода больше, как хорошо.

+0

Привет, Sputnick, это не сработало, не найти ни от, ни присоединиться. Я запускаю CentOS. – user2019528