Проверьте наличие строки в строке в файле, если строка содержит предложение - PullRequest
0 голосов
/ 27 апреля 2018

У меня есть требование проверить, присутствует ли в строке предложение «IF EXISTS», содержит ли строка утверждение «DROP TABLE».

grep "DROP TABLE" * 

Выражение выше дает все строки во всех файлах в каталоге, имеющих оператор DROP TABLE. Но это не даст, если есть несколько пробелов между DROP и TABLE. Я хочу, чтобы команда извлекала только те строки, в которых есть оператор таблицы DROP, но нет предложения IF EXITS, игнорируя несколько пробелов между

DROP TABLE TABLE1  IF EXISTS;
## command should not display above line

DROP    TABLE TABLE1  IF    EXISTS;
## command should not display above line

DROP TABLE TABLE1  ;
### command should display above line

DROP      TABLE table1;
### command should display above line

Оцените ответ: -)

Ответы [ 4 ]

0 голосов
/ 27 апреля 2018

Если ваш grep поддерживает регулярное выражение Perl (скорее всего):

grep -P 'DROP\s+TABLE\s+\w+\s*(?!IF\s+EXISTS)\s*;' *

Проверьте объяснение

0 голосов
/ 27 апреля 2018

Использование awk:

awk '/\yDROP[[:blank:]]+TABLE\y/ && !/\yIF[[:blank:]]+EXISTS\y/' file

Пояснение:

В основном команда выглядит так:

awk '/DROP TABLE/ && !/IF EXISTS/' file

, которая печатает строки с табличкой DROP TABLE, но не содержит IF EXISTS.

Тогда мы допускаем несколько пробелов или табуляций между

awk '/DROP[[:blank:]]+TABLE/ && !/IF[[:blank:]]+EXISTS/' file

В конце мы выравниваем их по границам слов , чтобы убедиться, что DROP не будет совпадать с чем-то вроде XYDROP

awk '/\yDROP[[:blank:]]+TABLE\y/ && !/\yIF[[:blank:]]+EXISTS\y/' file
0 голосов
/ 27 апреля 2018

По умолчанию grep использует базовые регулярные выражения. Вы можете выразить свои критерии так:

grep "DROP \+TABLE" * | grep -v "IF \+EXISTS"

-v инвертирует совпадение.

Использование режима -v " word regex " может быть более безопасным (но правильный синтаксический анализатор будет лучше, если ваш входной файл может содержать произвольно сложные операторы SQL):

grep -w "DROP \+TABLE" * | grep -vw "IF \+EXISTS"

Если в вашем файле есть строка вроде:

NODROP TABLE FOO

Первая версия будет включать его в вывод, а вторая - нет.

DROP TABLE FOO IF ISEXISTSWHATERVER

Будет включено в первую версию, но будет отфильтровано в версии с -w.

Спасибо hek2mgl за предложение -w.

0 голосов
/ 27 апреля 2018

можете попробовать tr -s ''. Это позволит удалить несколько пробелов между

echo "DROP    TABLE" | tr -s ' ' | grep "DROP TABLE"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...