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

时间:2018-10-03 14:33:45

标签: regex linux command-line grep

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

  
    

假设您一直在用tail -f看日志文件。管那个     进入grep调用,该调用会过滤尾部输入并仅显示行     在行首匹配“ YYYY-MM-DD”格式的今天日期(对于     任何未来的“今天”),并在任何“”中包含字符串“ [error.critical]”     大写。注意细节;匹配应该是     完全如此处所述。

  

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

  

2018-10-03 [erroR.critical] sadkhasdhaksd

     

2018-10-03 sadkhasdhaksd [error.critical]

     

2018-10-03 sadkhasdhaksd [error.noncritical]

     

2018-10-26 sadkhasdhaksd [error.critical]

     

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 个答案:

答案 0 :(得分:3)

您可以使用此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]

  • 此正则表达式与今天开始的日期之后的空格匹配。
  • .应该转义,否则应与任何字符匹配。
  • 在BRE中无需对[.进行两次转义。
  • 转义]是可选的
  • -o选项仅用于提取匹配的文本,因此可以避免。