如果该行包含“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
欣赏回应: - )
答案 0 :(得分:2)
默认情况下,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
的<。}}过滤掉。
感谢-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
最后,我们将它们与字词边界对齐,以确保DROP
与XYDROP
awk '/\yDROP[[:blank:]]+TABLE\y/ && !/\yIF[[:blank:]]+EXISTS\y/' file
答案 2 :(得分:0)
你可以试试tr -s''。这将删除之间的多个空格
echo "DROP TABLE" | tr -s ' ' | grep "DROP TABLE"
答案 3 :(得分:0)