我有一堆带有sql日志的文件。我期待提取以下所有模式
SQL日志的sql看起来像这样
sel *
from DB.T1;
update DB.T1;
delete from DB.T2;
collect stats on
DB.T3 index (a,b,c);
sel count(*) from Db.T1;
sel count(*) from db . T2;
sel count(*) from db.t2;
我想扫描以logs_开头的文件,并提取所有唯一的表,后跟字符串DB./db./Db./dB。 正如您所看到的,在几个实例中db后面有空格
我期待的输出是重复数据删除列表 T1,T2,T3
我在Mac OS X上。
这是我能得到的。我无法超越这个
grep -o -i 'tb.*\Z' *logs_* | uniq
这会得到空的结果。我正在使用\ Z,因为我想要直到字符串的结尾(而不是行尾)
需要帮助来建立正确的命令。
答案 0 :(得分:0)
类似的东西:
grep -E -o -i 'DB ?\. ?[A-Z0-9$_]+' | cut -d . -f 2 | tr -d ' ' | sort -u
据我所知,grep不支持\ Z.在支持它的语言中,它实际上意味着直到字符串的结尾,而不是某些"字的结束"在字符串中。因此,您需要在grep中明确匹配表名。
我使用-E来使用grep的扩展正则表达式,这使得+
和?
被识别为正则表达式元字符。这不是绝对必要的;你可以放弃-E并改用\+
和\?
。
正则表达式DB ?\. ?[A-Z0-9$_]+
(如果您不使用-E标志,则为DB \?\. \?[A-Z0-9$_]\+
)匹配:
the literal characters "DB" (case insensitively, because of -i)
an optional space
a literal "."
an optional space
one or more of any ascii letters, digits, $ or _ (the characters that can appear in an unquoted mysql table name)
cut删除数据库名称,tr删除表名前的空格,sort -u只返回唯一的表名。 (uniq本身不会这样做;它只删除与前一行重复的行,所以如果你先排序,只会做你想要的。)