grep中的动态匹配(双grep) - 反向引用?

时间:2017-01-06 18:34:08

标签: regex grep

从这个输出:

    2017-01-06 15:28:21,384 INFO  [py.com.interceptors.SecurityInterceptor] (default task-14) (#1dfp) {"id":"1dfp","method":"getImageById","actionURL":"/image/get/{imageId}","admin":"mgarcia"}
    2017-01-06 15:28:21,384 INFO  [py.com.SomeOtherClass] (default task-14) (#1dfp) something I don't even know why I wanna log 
more lines that not necessary have the same format
    2017-01-06 15:28:21,384 INFO  [py.com.SomeOtherClass] (default task-14) (#1111) something I don't even know why I wanna log 
more lines that not necessary have the same format
    2017-01-06 15:28:21,384 INFO  [py.com.SomeOtherClass] (default task-14) (#1111) something I don't even know why I wanna log
    2017-01-06 15:28:21,384 INFO  [py.com.SomeOtherClass] (default task-14) (#1dfp) something I don't even know why I wanna log

我想得到:

2017-01-06 15:28:21,384 INFO  [py.com.interceptors.SecurityInterceptor] (default task-14) (#**1dfp**) {"id":"1dfp","method":"getImageById","actionURL":"/image/get/{imageId}","admin":"mgarcia"}
2017-01-06 15:28:21,384 INFO  [py.com.SomeOtherClass] (default task-14) (#1dfp) something I don't even know why I wanna log
2017-01-06 15:28:21,384 INFO  [py.com.SomeOtherClass] (default task-14) (#1dfp) something I don't even know why I wanna log

所有那些有(#1dfp)的行,基本上只有我不知道值:(#1dfp)直到我做grep'/ image / get / {imageId}'

是否可以在一行中完成?像:

tail -f $ log | grep'一些反向引用或OR会让我得到所有(#1dfp)/ image / get / {imageId}'

谢谢!

1 个答案:

答案 0 :(得分:0)

您可以使用awk

awk -F '[()]' 'index($0, "/image/get/{imageId}"){id=$4} $4 == id' file.log

2017-01-06 15:28:21,384 INFO  [py.com.interceptors.SecurityInterceptor] (default task-14) (#1dfp) {"id":"1dfp","method":"getImageById","actionURL":"/image/get/{imageId}","admin":"mgarcia"}
2017-01-06 15:28:21,384 INFO  [py.com.SomeOtherClass] (default task-14) (#1dfp) something I don't even know why I wanna log
2017-01-06 15:28:21,384 INFO  [py.com.SomeOtherClass] (default task-14) (#1dfp) something I don't even know why I wanna log

工作原理:

  • 我们使用()作为输入字段分隔符
  • index($0, "/image/get/{imageId}")找到包含文字/image/get/{imageId}的行,然后id=$4将第4个字段分配给id
  • 然后$4 == id只会打印$4与变量id相同的所有行