【问题标题】:Regex match one but not another正则表达式匹配一个但不匹配另一个
【发布时间】:2017-06-14 15:34:25
【问题描述】:

所以我有这个日志文件

2017-06-14 08:53:41,472 - [error] javascript - "Javascript error: undefined - url: undefined - line: undefined - browser: Chrome 57.0 
2017-06-14 08:53:41,472 - [error] javascript - "Javascript error: undefined - url: undefined - line: undefined - browser: Chrome 57.0 
2017-06-14 08:53:41,472 - [error] javascript - "Javascript error: undefined - url: undefined - line: undefined - browser: Chrome 57.0 
2017-06-14 08:53:45,010 - [error] javascript - "Javascript error: undefined - url: undefined - line: undefined - browser: Chrome 57.0 
2017-05-23 18:38:35,966 - [info] access - example.com "GET HTTP/1.1" 52228 200 0 159 "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36"
2017-05-23 18:38:37,811 - [info] access - example.com "GET HTTP/1.1" 53716 200 0 301 "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36"
2017-06-14 08:53:45,010 - [error] javascript - "Javascript error: undefined - url: undefined - line: undefined - browser: Chrome 57.0 
2017-06-14 08:53:45,011 - [error] javascript - "Javascript error: undefined - url: undefined - line: undefined - browser: Chrome 57.0 
2017-06-14 08:53:45,011 - [error] javascript - "Javascript error: undefined - url: undefined - line: undefined - browser: Chrome 57.0 
2017-06-14 09:40:04,506 - [error] javascript - "Javascript error: undefined - url: undefined - line: undefined - browser: Chrome 58.0 
2017-06-14 12:32:40,779 - [error] javascript - "Javascript error: undefined - url: undefined - line: undefined - browser: Chrome 57.0
2017-06-14 13:22:40,988 - [error] javascript - "Javascript error: undefined - url: undefined - line: undefined - browser: Internet Explorer 11.0
2017-06-14 13:24:45,023 - [error] javascript - "Javascript error: undefined - url: undefined - line: undefined - browser: Internet Explorer 11.0
2017-06-14 13:25:16,091 - [error] javascript - "Javascript error: undefined - url: undefined - line: undefined - browser: Internet Explorer 11.0
2017-06-14 13:26:18,138 - [error] javascript - "Javascript error: undefined - url: undefined - line: undefined - browser: Internet Explorer 11.0
2017-05-23 18:38:34,874 - [info] access - example.com "GET HTTP/1.1" 673 304 0 0 "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36"
2017-05-23 18:38:35,428 - [info] access - example.com "GET HTTP/1.1" 662 304 0 0 "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36"
2017-05-23 18:38:57,901 - [info] access - example.com "GET HTTP/1.1" 745 304 0 0 "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36"
2017-06-14 13:27:20,425 - [error] javascript - "Javascript error: undefined - url: undefined - line: undefined - browser: Internet Explorer 11.0
2017-06-14 13:28:22,237 - [error] javascript - "Javascript error: undefined - url: undefined - line: undefined - browser: Internet Explorer 11.0
2017-06-14 13:28:53,225 - [error] javascript - "Javascript error: undefined - url: undefined - line: undefined - browser: Internet Explorer 11.0
2017-06-14 13:29:24,139 - [error] javascript - "Javascript error: undefined - url: undefined - line: undefined - browser: Internet Explorer 11.0
2017-06-14 13:32:30,227 - [error] javascript - "Javascript error: undefined - url: undefined - line: undefined - browser: Internet Explorer 11.0
2017-05-23 18:38:33,881 - [info] access - example.com "GET HTTP/1.1" 603 304 0 0 "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36"
2017-05-23 18:38:34,111 - [info] access - example.com "GET HTTP/1.1" 675 304 0 0 "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36"
2017-05-23 18:38:34,144 - [info] access - example.com "GET HTTP/1.1" 481 304 0 0 "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36"
2017-06-14 13:33:01,250 - [error] javascript - "Javascript error: undefined - url: undefined - line: undefined - browser: Internet Explorer 11.0
2017-06-14 13:35:05,346 - [error] javascript - "Javascript error: undefined - url: undefined - line: undefined - browser: Internet Explorer 11.0
2017-06-14 13:36:07,563 - [error] javascript - "Javascript error: undefined - url: undefined - line: undefined - browser: Internet Explorer 11.0
2017-06-14 13:39:13,557 - [error] javascript - "Javascript error: undefined - url: undefined - line: undefined - browser: Internet Explorer 11.0
2017-06-14 13:39:33,777 - [error] javascript - "Javascript error: undefined - url: undefined - line: undefined - browser: Chrome 58.0
2017-05-23 18:38:58,445 - [info] access - example.com "GET HTTP/1.1" 859 304 0 0 "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36"
2017-05-23 18:38:58,485 - [info] access - example.com "GET HTTP/1.1" 819 304 0 0 "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36"
2017-05-23 18:38:58,720 - [info] access - example.com "GET HTTP/1.1" 654 304 0 0 "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36"
2017-05-23 18:38:58,760 - [info] access - example.com "GET HTTP/1.1" 624 304 0 0 "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36"
2017-06-14 13:39:44,517 - [error] javascript - "Javascript error: undefined - url: undefined - line: undefined - browser: Internet Explorer 11.0
2017-06-14 13:45:25,661 - [error] javascript - "Javascript error: undefined - url: undefined - line: undefined - browser: Internet Explorer 11.0
2017-06-14 13:46:58,629 - [error] javascript - "Javascript error: undefined - url: undefined - line: undefined - browser: Internet Explorer 11.0
2017-06-14 13:49:02,639 - [error] javascript - "Javascript error: undefined - url: undefined - line: undefined - browser: Internet Explorer 11.0
2017-06-14 13:49:40,884 - [error] javascript - "Javascript error: undefined - url: undefined - line: undefined - browser: Internet Explorer 11.0
2017-05-23 18:38:34,369 - [info] access - example.com "GET HTTP/1.1" 683 304 0 0 "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36"
2017-05-23 18:38:58,181 - [info] access - example.com "GET HTTP/1.1" 886 304 0 0 "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36"
2017-05-23 18:38:58,210 - [info] access - example.com "GET HTTP/1.1" 662 304 0 0 "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36"
2017-06-14 13:50:04,713 - [error] javascript - "Javascript error: undefined - url: undefined - line: undefined - browser: Internet Explorer 11.0
2017-06-14 13:50:27,767 - [error] javascript - "Javascript error: undefined - url: undefined - line: undefined - browser: Internet Explorer 11.0
2017-06-14 13:50:27,767 - [error] javascript - "Javascript error: undefined - url: undefined - line: undefined - browser: Internet Explorer 11.0
2017-06-14 13:50:27,767 - [error] javascript - "Javascript error: undefined - url: undefined - line: undefined - browser: Internet Explorer 11.0
2017-06-14 14:04:44,239 - [error] javascript - "Javascript error: undefined - url: undefined - line: undefined - browser: PhantomJS 2.1

我想用一个正则表达式查找文件中的所有错误,但不是包含“Internet Explorer 11”的错误行。

使用 regex101.com 我能够找出这个正则表达式 我能够找到一个匹配的正则表达式:(\[.*error.*\])(?!.*Internet Explorer 11.*)

regex101

现在我想知道如何在命令行上执行它来测试它。

我尝试过的

这些显示没有输出(必须转义!

grep "(\[.*error.*\]){1,}(?\!.*Internet Explorer 11.*)" /var/log/upstart/app.log

egrep "(\[.*error.*\]){1,}(?\!.*Internet Explorer 11.*)" /var/log/upstart/app.log

有人知道怎么做吗?任何帮助表示赞赏

【问题讨论】:

  • 顺便说一句,转义! 有点困难,"!foo" 会尝试历史扩展,"\!foo" 会同时打印反斜杠和感叹号。解决方法是使用单引号,或者完全禁用历史扩展。
  • 为什么需要一个正则表达式?例如,您是否有某些原因不能grep -F '[error]' | grep -v -F 'Internet Explorer 11'

标签: regex bash


【解决方案1】:

(?!...) 这样的前瞻模式是特定于 Perl 正则表达式的,而不是 grep 使用的常用基本和扩展正则表达式的一部分。

但是你想要的很容易用 grep 和管道来完成:

grep -F '[error]' /var/log/upstart/app.log | grep -vF 'Internet Explorer 11'

或者您可以使用grep -P(使用 GNU grep)或pcregrep,它们支持 Perl 正则表达式:

pcregrep '(\[.*error.*\])(?!.*Internet Explorer 11.*)' /var/log/upstart/app.log

(GNU grep 的手册中提到 -P 是“高度实验性的”,但它并不是一个新功能,实际上似乎工作正常。)

【讨论】:

  • 即使这个解决方案有效,我也需要它在一个正则表达式中,因为我必须将它传递给一个解析正则表达式的工具,并且只有一个输入字段。我只是想看看如何使用 grep 对其进行测试。
  • @Firewall,然后是pcregrepgrep -P。假设您使用的工具也使用 Perl 兼容的正则表达式,因为如果不是,该模式也不会在那里工作。
【解决方案2】:

使用单个 awk 命令:

awk '$4~/error/ && $0!~/Internet Explorer 11/' file

输出:

2017-06-14 08:53:41,472 - [error] javascript - "Javascript error: undefined - url: undefined - line: undefined - browser: Chrome 57.0 
2017-06-14 08:53:41,472 - [error] javascript - "Javascript error: undefined - url: undefined - line: undefined - browser: Chrome 57.0 
2017-06-14 08:53:41,472 - [error] javascript - "Javascript error: undefined - url: undefined - line: undefined - browser: Chrome 57.0 
2017-06-14 08:53:45,010 - [error] javascript - "Javascript error: undefined - url: undefined - line: undefined - browser: Chrome 57.0 
2017-06-14 08:53:45,010 - [error] javascript - "Javascript error: undefined - url: undefined - line: undefined - browser: Chrome 57.0 
2017-06-14 08:53:45,011 - [error] javascript - "Javascript error: undefined - url: undefined - line: undefined - browser: Chrome 57.0 
2017-06-14 08:53:45,011 - [error] javascript - "Javascript error: undefined - url: undefined - line: undefined - browser: Chrome 57.0 
2017-06-14 09:40:04,506 - [error] javascript - "Javascript error: undefined - url: undefined - line: undefined - browser: Chrome 58.0 
2017-06-14 12:32:40,779 - [error] javascript - "Javascript error: undefined - url: undefined - line: undefined - browser: Chrome 57.0
2017-06-14 13:39:33,777 - [error] javascript - "Javascript error: undefined - url: undefined - line: undefined - browser: Chrome 58.0
2017-06-14 14:04:44,239 - [error] javascript - "Javascript error: undefined - url: undefined - line: undefined - browser: PhantomJS 2.1

【讨论】:

    【解决方案3】:

    使用 grep (-v) 的开关进行管道和排除有更简单的方法...但如果您确实想要纯正则表达式解决方案:

    grep -P '^((?!Internet\ Explorer\ 11).)*\[error\]((?!Internet\ Explorer\ 11).)*$' filename
    

    这里 -P 使用 perl 正则表达式,我认为这是前瞻所必需的

    【讨论】:

    • 太棒了!如果它适合你,请投票或接受我的回答!
    • 太棒了!如果它适合你,请投票或接受我的回答!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多