在Linux中,为给定的正规表达式 显示匹配的行

分享于 

3分钟阅读

电脑

  繁體 雙語

问题:

我在日志文件中使用该表示法:

[something-something ]

有必要和可变长度字符和数字。 我的特殊日志文件包含上面解释了字符的行。 I.e.


Line 1: DEBUG [AS-kmksdf] Error occured!


Line 2: something somethingg..



我想得到第 1行。 我的日志文件动态增长,并在屏幕上显示:

 
tail -f log.txt



 

我怎么才能把这些特殊的线条?

我知道我将使用 grep,我的正规表达式 将是。 像

 
[[A-Z]*-[A-Z]*]



 

如何将它们与命令组合起来。 这里操作不起作用:


tail -f log.txt | grep [[A-Z]*-[A-Z]*]



我在windows7中使用 CYGWIN,并且可以在 cmd.exe. 上运行一些linux命令


回答 1:

正则表达式有以下几个问题:

  • 首先,我建议你始终使用 -P switch,这使得 Perl兼容的正规表达式 服务成为可能。

    默认情况下,grep 使用基本正则表达式,它不广泛使用,并且受到不一致的。

  • brackets [A-Z],括号在 正规表达式 中有特殊含义。 若要在PCREs中使用文本括号,请使用反斜杠将它的转义: [ 或者 ]

  • 除非你设置 -i switch,否则 正规表达式 区分大小写。

  • * 指的是任意数量的事件,包括( 0 )。 你可能希望使用 + 而不是( 任何阳性 occurrences次数)。

  • surround将正则表达式用双引号括起来,否则bash将展开字符。

因此,以下命令将工作:


tail -f log.txt | grep -Pi"[[A-Z]+-[A-Z]+]"




回答 2:


tail -f log.txt |grep -E '[[a-zA-Z]*-[a-zA-Z]*]'



你可以使用 Regexpal 测试你的正规表达式 表达式。 你也应该在 grep 上使用 -E。 在这种情况下,它不是必需的,但在这种情况下,允许使用扩展的正规表达式 表达式。



MAT  显示