字符串提取和重复过滤 mac OS X

string extraction and dupes filtering mac OS X

我有一堆带有 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。 正如您所看到的,在少数情况下 space 后面有白色 space

我期望的输出是去重列表 T1、T2、T3

我在 Mac OS X.

这就是我能得到的。我无法通过这个

grep -o -i 'tb.*\Z' *logs_* | uniq

这给出了空结果。我一直在使用 \Z 直到字符串的末尾(而不是行的末尾)

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

类似于:

grep -E -o -i 'DB ?\. ?[A-Z0-9$_]+' | cut -d . -f 2 | tr -d ' ' | sort -u

\Z 不被 grep 支持,据我所知。在支持它的语言中,它实际上意味着直到字符串的结尾,而不是字符串中某些 "word" 的结尾。因此,您需要在 grep.

中明确匹配 table 名称

我使用 -E 来使用 grep 的扩展正则表达式,这使得 +? 被识别为正则表达式元字符。这不是绝对必要的;您可以不使用 -E 而是使用 \+\?

正则表达式 DB ?\. ?[A-Z0-9$_]+(或 DB \?\. \?[A-Z0-9$_]\+,如果您不使用 -E 标志)匹配:

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 删除 table 名称前的空格,sort -u returns 仅删除唯一的 table 名称。 (uniq 本身不会这样做;它只会删除与前一行重复的行,因此只有先排序才能完成您想要的操作。)