字符串提取和重复过滤 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 本身不会这样做;它只会删除与前一行重复的行,因此只有先排序才能完成您想要的操作。)
我有一堆带有 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 本身不会这样做;它只会删除与前一行重复的行,因此只有先排序才能完成您想要的操作。)