如果行包含句子,请检查文件中一行中的字符串

时间:2018-04-27 08:41:50

标签: bash shell unix

如果该行包含“DROP TABLE”语句,我需要检查行中是否存在“IF EXISTS”子句。

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 :(得分:2)

默认情况下,grep使用基本的正则表达式。您可以这样表达您的标准:

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

-v反转了匹配。

使用-vword regex”模式可能更安全(但如果您的输入文件可能包含任意复杂的SQL语句,那么正确的解析器最好):

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

如果您的文件包含以下行:

NODROP TABLE FOO

第一个版本会在输出中包含它,但第二个版本不会。

DROP TABLE FOO IF ISEXISTSWHATERVER

将包含在第一个版本中,但会被-w的<。}}过滤掉。

感谢-w提出.Select(i=> new T{...})建议。

答案 1 :(得分:1)

使用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

最后,我们将它们与字词边界对齐,以确保DROPXYDROP

之类的想法不匹配
awk '/\yDROP[[:blank:]]+TABLE\y/ && !/\yIF[[:blank:]]+EXISTS\y/' file

答案 2 :(得分:0)

你可以试试tr -s''。这将删除之间的多个空格

echo "DROP    TABLE" | tr -s ' ' | grep "DROP TABLE"

答案 3 :(得分:0)

如果您的grep支持Perl正则表达式(最有可能):

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

检查explantion