字符串提取和欺骗过滤mac OS X

时间:2017-12-26 18:56:28

标签: regex grep osx-yosemite

我有一堆带有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,因为我想要直到字符串的结尾(而不是行尾)

需要帮助来建立正确的命令。

1 个答案:

答案 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本身不会这样做;它只删除与前一行重复的行,所以如果你先排序,只会做你想要的。)