【问题标题】:string extraction and dupes filtering mac OS X字符串提取和欺骗过滤 mac OS X
【发布时间】:2017-12-28 06:52:45
【问题描述】:

我有一堆带有 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 直到字符串的末尾(而不是行尾)

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

【问题讨论】:

    标签: regex grep osx-yosemite


    【解决方案1】:

    类似:

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

    \Z 据我所知,grep 不支持。在支持它的语言中,它实际上意味着直到字符串的结尾,而不是字符串中某个“单词”的结尾。所以你需要在你的 grep 中显式匹配表名。

    我使用 -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 删除表名前的空格,sort -u 只返回唯一的表名。 (uniq 本身不会这样做;它只会删除与前一行重复的行,因此只有在您先排序时才会执行您想要的操作。)

    【讨论】:

    • 谢谢……你能解释一下命令是如何工作的吗?当我执行这个时,我得到了几行与模式不匹配的行,我得到了完整的行,比如 select * from DB.T1 ..
    • @pmv 您是否遗漏了-o?请准确显示您在这里尝试过的内容
    • 你好。谢谢。你能帮我理解 -E 的作用和部分 'DB 吗?\。 ?[A-Z0-9$_]+'
    • @pmv 添加了正则表达式的解释
    猜你喜欢
    • 1970-01-01
    • 2014-02-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-21
    • 2011-11-29
    • 2013-02-28
    • 1970-01-01
    • 2011-06-01
    相关资源
    最近更新 更多