BASH:如何 Grep 并显示一组值

BASH:如何 Grep 并显示一组值

在示例日志消息中,我们有

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

相关内容