我的日志文件格式如下: -
tx=267c5660-c49a-4ae7-b5ae-c9d43e23b617, rh=163.172.0.0, userId=-1, requestComplete={ requestId=74421156932, entityResourceType=xyz, pageId=homePage, uri=/home/, duration(ms)=422
我如何只针对uri
或duration
等特定字段或uri
和duration
等两者的组合进行grep。
基本上当我使用tail命令时,我想在o / p中只有2个字段 uri和持续时间。
答案 0 :(得分:3)
我们可以使用cut命令。根据日志,有一个分离器即“,”。因此我们可以使用“,”作为分隔符,我们需要给出字段编号,在我们的例子中,uri和持续时间是8,9。
cat "logfile" | cut -d"," -f7,8
由于
答案 1 :(得分:0)
对于像
这样的变量var=$'2017-04-21 09:04:42,649 +0000 [exec-12056] EventLogger - cid=rio, tx=267c5660-c49a-4ae7-b5ae-c9d43e23b617, rh=163.172.0.0, userId=-1, requestComplete={ requestId=74421156932, entityResourceType=xyz, pageId=homePage, uri=/riokc95758/, duration(ms)=422'
你可以考虑用GNU grep这样的东西:
$ grep -Po 'uri=\K.[^,]*' <<<"$var"
/riokc95758/
$ grep -Po 'uri=/\K.[^,/]*' <<<"$var"
riokc95758
$ grep -Po '.*duration\(ms\)=\K.[^,]*' <<<"$var" #if duration is the last field you can use just grep -Po '.*duration\(ms\)=\K.*'
422
甚至你可以使用sed与正则表达式组和反向引用:
$ sed -E "s/(.*uri=)(.[^,]*)(.*duration\(ms\)=)(.[^,]*)(.*)/\2,\4/" <<<"$var"
/riokc95758/,422
您可以将上述每个命令分配给$ newvar=$(egrep .... )
答案 2 :(得分:0)
如果模式具有一致数量的逗号分隔值,则可以使用cut
。订单也必须保持一致。
否则, double grep 可以获取您正在寻找的值:
grep -Eo "uri=/.*/" | grep -Eo "/.*/" # gets uri
grep -Eo "duration\(ms\)=[0-9]+" | grep -Eo "[0-9]+" # gets duration
在输入的第一个示例中,grep -Eo "uri=/.*/"
将返回duration(ms)=422
。使用第二个grep链接它允许您单独隔离422
。
这有点类似于this answer