代码之家  ›  专栏  ›  技术社区  ›  Lajos Arpad

如何将正则表达式与不受欢迎的字符串匹配?

  •  2
  • Lajos Arpad  · 技术社区  · 7 年前

    首先,我想澄清一下我的问题的背景。我要在面试中证明自己,面试模拟现实世界,我可以咨询任何人,做任何事情,期望我能想出正确的答案。我已经解决了很多问题,但是有了这个问题,我陷入了困境,因为我对正则表达式和Linux命令行不是很了解。我要解决这个任务:

    假装你一直在看一个日志文件 tail -f . 管那 到一个grep调用中,该调用过滤尾部输入并只显示行 以“YYYY-MM-DD”格式匹配今天的日期(用于 任何未来的“今天”),并且包含字符串'[error.critical]' 资本化。注意细节;匹配应该是 完全如本文所述。

    为此,我创建了一个名为log的文件,其中包含用于测试的此内容:

    2018-10-03[错误.严重]Sadhasdhaksd

    2018-10-03 Sadhasdhaksd[错误.严重]

    2018-10-03 Sadhasdhaksd[错误,非关键]

    2018-10-26 Sadhasdhaksd[错误.严重]

    2018-10-03红色警报[错误.严重]

    2018-10-03红色警报错误。严重红色警报

    2018-10-03[错误.严重]

    我想出了这个解决方案:

    tail -f log | grep -io "^$(date +"%Y-%m-%d")".*\\[error.critical\\]
    

    然而,他们说他们可以想象两种字符串,它们将错误地匹配这个正则表达式。我意识到以下问题:

    • 我没有强制执行日期后的空间
    • 我没有把结果写得正确,就像后来一样 [error.critical] 应输出附加文本
    • 我也可能搞错了引号,没有把它放在字符串的末尾。

    同样,我对正则表达式或Linux命令行不是很了解。目前的方法是

    tail -f log | grep -io "^$(date +"%Y-%m-%d") .*\\[error.critical\\].*"
    

    我经过仔细考虑后发现的问题都解决了。但是,他们说我在这里提出的第一个正则表达式可以匹配两种类型的字符串,而这两种类型的字符串不应该出现在结果中。我意识到其中一种类型(没有空格),但我不知道另一种类型的字符串与我的正则表达式不匹配。你能告诉我哪种字符串会与第一个正则表达式不匹配,除了那些在日期后省略空格的字符串?

    1 回复  |  直到 7 年前
        1
  •  3
  •   anubhava    7 年前

    你可以用这个 grep :

    tail -f log | grep -i "^$(date '+%Y-%m-%d') .*\[error\.critical]"
    

    2018-10-03 [erroR.critical]sadkhasdhaksd
    2018-10-03 sadkhasdhaksd [error.critical]
    2018-10-03 red alert [Error.critical]
    2018-10-03 [error.critical]
    

    • 这个regex在今天的开始日期之后匹配一个空格。
    • . 应该转义,否则它匹配任何字符。
    • 不需要双重逃避 [ . 在BRE。
    • 逃逸 ] 是可选的
    • -o 选项仅用于提取匹配的文本,这样可以避免。