在示例日志消息中,我们有
20161110-15:29:39.707932513|8=FIX.4.29=031735=D34=00000389552=20161110-15:29:39.70749=413050=11156=DDG109=4130115=EAGLE7|EAGLE7116=eagle_fix_trader11|eagle_fix_trader11144=DAU|E7T9139=eagle_fix_trader119195=U439=805440=150854029208=221=1167=FUT55=14198040=259=054=111=41301110400144=0000035.0000000038=00000000760=20161110-15:29:39.70710=092
从上面你怎么能只显示 9139 值,所以它看起来像
9139=eagle_fix_trader11
我使用了下面的命令
ls | grep -Eo '9139=[a-z]{0,8}' 9707le8.log
但我只得到
9139=eagle
代替
9139=eagle_fix_trader11
有任何想法吗?
答案1
首先,ls |
那里完全没用。您想要在 file 内部搜索9707le8.log
,而不是在当前目录(这是打印的内容)中的文件和目录列表中搜索ls
。无论如何,当它也被赋予一个文件名以在命令行上搜索时,grep
会忽略通过管道传递给它的任何输入 ( )。| grep
也就是说,你的正则表达式意味着“找到字符串9139=
,后跟 <= 8 个小写字母”。然而, =
;后面只有 5 个字母。第 6 个字符是 an _
,它不属于[a-z]
字符组。一个简单的解决方案是将其添加到类中:
$ grep -Eo '9139=[a-z_]{0,8}' 9707le8.log
9139=eagle_fi
现在,既然你想要9139=eagle_fix11
,你需要增加字符:
$ grep -Eo '9139=[a-z_]{0,18}' 9707le8.log
9139=eagle_fix_trader
这次,问题是您没有匹配数字,因为[a-z_]
不包含它们。所以,你想要这样的东西:
$ grep -Eo '9139=[a-z_0-9]{0,18}' 9707le8.log
9139=eagle_fix_trader11
或者,对于更一般的情况,您需要9139=
一串小写字母或_
两个数字,您可以使用:
$ grep -Eo '9139=[a-z_]+[0-9]{2}' 9707le8.log
9139=eagle_fix_trader11
或者,使用 GNU grep:
$ grep -Po '9139=[a-z_]+\d{2}' 9707le8.log
9139=eagle_fix_trader11