使用shell脚本在日志模式中获取特定键值

时间:2017-04-21 09:25:00

标签: linux shell

我的日志文件格式如下: -

 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

我如何只针对uriduration等特定字段或uriduration等两者的组合进行grep。

基本上当我使用tail命令时,我想在o / p中只有2个字段 uri和持续时间

3 个答案:

答案 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