【问题标题】:Grep to extract the word matching the given patterngrep 提取与给定模式匹配的单词
【发布时间】:2013-08-20 15:11:59
【问题描述】:

我有一个包含类似条目的日志文件

INFO 2013-08-16 13:46:48,660 Index=abc:12 insertTotal=11  
INFO 2013-08-16 13:46:48,660 Index=abcd:12 insertTotal=11  
INFO 2013-08-16 13:46:48,660 Index=def:134 insertTotal=11  
INFO 2013-08-16 13:46:48,660 Index=abkfe insertTotal=11
INFO 2013-08-16 13:46:48,660 Index=lmkfe insertTotal=11
INFO 2013-08-16 13:46:48,660 Index=lmkfe insertTotal=11

我想 grep 并提取与我的模式匹配的单词 abc:<some_number>def:<some_number>

$ cat "log.txt" | grep -w "abc" -w "def" >> "failed_values.txt";

所以在这种情况下,我的failed_values.txt 应该只有

abc:12
def:134

要注意的关键是我的模式以: 结尾,后跟一个数字,然后是一个空格 e。 G。 abc:122.

【问题讨论】:

  • 编辑了问题。谢谢@Tichodroma
  • 为什么不包括abcd:12
  • 因为我的后缀只有 abc: 换句话说,在日志文件中我正在搜索 John:1212 和 Tim:1212 而不是随机字母

标签: shell unix


【解决方案1】:

尝试以下操作:

$ grep  -Eio '[a-z]+:[0-9]+' log.txt 
abc:12
abcd:12
def:134
  • -i 忽略大小写。
  • -o 仅打印匹配的部分。

更新

只匹配abc / def

$ grep  -Eio '\b(abc|def):[0-9]+\b' log.txt 
abc:12
def:134
  • (abc|def)::匹配 abc 或(|)def 后跟 :
  • [0-9]+:匹配号码。
  • \b: 匹配单词边界

【讨论】:

  • 谢谢@falsetru 但我的前缀不是可变的,即这个词总是以 abc: 或 def: 开头
  • @John,我添加了关于所使用模式的说明。
  • @John,如果您不想匹配 ABC:123,请省略 -i 选项。
  • 谢谢@falsetru。是否可以将分隔符设置为 : 或 _ 所以本质上是 $ grep -Eio '\b(abc|def)(:/_)[0-9]+\b' log.txt
  • @John,使用[:/_] 而不是(:/_)
【解决方案2】:
$ grep -Eo "(abc|def):[0-9]*" log.txt
abc:12
def:134

【讨论】:

    【解决方案3】:

    应该这样做:

    grep "[ad][be][cf]:[0-9]*" [your file]

    【讨论】:

      猜你喜欢
      • 2018-12-10
      • 1970-01-01
      • 2019-04-30
      • 2013-10-09
      • 2018-05-12
      • 2010-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多