Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 计算基于时间的指标(每小时)_Bash_Shell_Unix_Awk - Fatal编程技术网

Bash 计算基于时间的指标(每小时)

Bash 计算基于时间的指标(每小时),bash,shell,unix,awk,Bash,Shell,Unix,Awk,如何根据日志文件数据计算基于时间的指标(每小时平均值) 让我更清楚,考虑一个日志文件,其中包含如下条目:每个UID只在日志中出现两次。它们将采用嵌入式xml格式。它们可能会出现顺序错误。并且日志文件将只包含一天的数据,因此只有一天的记录 日志文件中的UID数量为200万 我必须找出这些请求的平均每小时响应时间。下面的日志文件中有请求和响应。UID是关联b/w请求和响应的关键 2013-04-03 08:54:19,451 INFO [Logger] <?xml version="1.0"

如何根据日志文件数据计算基于时间的指标(每小时平均值)

让我更清楚,考虑一个日志文件,其中包含如下条目:每个UID只在日志中出现两次。它们将采用嵌入式xml格式。它们可能会出现顺序错误。并且日志文件将只包含一天的数据,因此只有一天的记录

日志文件中的UID数量为200万

我必须找出这些请求的平均每小时响应时间。下面的日志文件中有请求和响应。UID是关联b/w请求和响应的关键

2013-04-03 08:54:19,451 INFO  [Logger] <?xml version="1.0" encoding="UTF-8" standalone="yes"?><log-event><message-time>2013-04-03T08:54:19.448-04:00</message-time><caller>PCMC.common.manage.springUtil</caller><body>&lt;log-message-body&gt;&lt;headers&gt;&amp;lt;FedDKPLoggingContext id="DKP_DumpDocumentProperties" type="context.generated.FedDKPLoggingContext"&amp;gt;&amp;lt;logFilter&amp;gt;7&amp;lt;/logFilter&amp;gt;&amp;lt;logSeverity&amp;gt;255&amp;lt;/logSeverity&amp;gt;&amp;lt;schemaType&amp;gt;PCMC.MRP.DocumentMetaData&amp;lt;/schemaType&amp;gt;&amp;lt;UID&amp;gt;073104c-4e-4ce-bda-694344ee62&amp;lt;/UID&amp;gt;&amp;lt;consumerSystemId&amp;gt;JTR&amp;lt;/consumerSystemId&amp;gt;&amp;lt;consumerLogin&amp;gt;jbserviceid&amp;lt;/consumerLogin&amp;gt;&amp;lt;logLocation&amp;gt;Beginning of Service&amp;lt;/logLocation&amp;gt;&amp;lt;/fedDKPLoggingContext&amp;gt;&lt;/headers&gt;&lt;payload&gt;  
&amp;lt;ratedDocument&amp;gt;  
    &amp;lt;objectType&amp;gt;OLB_BBrecords&amp;lt;/objectType&amp;gt;  
    &amp;lt;provider&amp;gt;JET&amp;lt;/provider&amp;gt;  
    &amp;lt;metadata&amp;gt;&amp;amp;lt;BooleanQuery&amp;amp;gt;&amp;amp;lt;Clause   occurs=&amp;amp;quot;must&amp;amp;quot;&amp;amp;gt;&amp;amp;lt;TermQuery   fieldName=&amp;amp;quot;RegistrationNumber&amp;amp;quot;&amp;amp;gt;44565153050735751&amp;amp;lt;/TermQuery&amp;amp;gt;&amp;amp;lt;/Clause&amp;amp;gt;&amp;amp;lt;/BooleanQuery&amp;amp;gt;&amp;lt;/metadata&amp;gt;  
&amp;lt;/ratedDocument&amp;gt;  
&lt;/payload&gt;&lt;/log-message-body&gt;</body></log-event>

2013-04-03 08:54:19,989 INFO  [Logger] <?xml version="1.0" encoding="UTF-8" standalone="yes"?><log-event><message-time>2013-04-03T08:54:19.987-04:00</message-time><caller>PCMC.common.manage.springUtil</caller><body>&lt;log-message-body&gt;&lt;headers&gt;&amp;lt;fedDKPLoggingContext id="DKP_DumpDocumentProperties" type="context.generated.FedDKPLoggingContext"&amp;gt;&amp;lt;logFilter&amp;gt;7&amp;lt;/logFilter&amp;gt;&amp;lt;logSeverity&amp;gt;255&amp;lt;/logSeverity&amp;gt;&amp;lt;schemaType&amp;gt;PCMC.MRP.DocumentMetaData&amp;lt;/schemaType&amp;gt;&amp;lt;UID&amp;gt;073104c-4e-4ce-bda-694344ee62&amp;lt;/UID&amp;gt;&amp;lt;consumerSystemId&amp;gt;JTR&amp;lt;/consumerSystemId&amp;gt;&amp;lt;consumerLogin&amp;gt;jbserviceid&amp;lt;/consumerLogin&amp;gt;&amp;lt;logLocation&amp;gt;Successful Completion of    Service&amp;lt;/logLocation&amp;gt;&amp;lt;/fedDKPLoggingContext&amp;gt;&lt;/headers&gt;&lt;payload&gt;0&lt;/payload&gt;&lt;/log-message-body&gt;</body></log-event>
输出应该是这样的 操作来自id,使用者来自documentmetadata,小时是时间08:54:XX 所以,若我们有多个请求和响应,那个么就需要计算在那个时刻发出的请求的平均响应时间

运行消费者小时平均响应时间(ms)

DKP_DumpDocumentProperties MRP 08 538

给定您发布的输入文件:

$ cat file
2013-04-03 08:54:19,989 INFO [LOGGER] <?xml version="1.0" encoding="UTF-8" standalone="yes"?><event><body>&amp;lt;UId&amp;gt;904c-be-4e-bbda-3e62&amp;lt;/UId&amp;gt;&amp;lt;</body></event>
2013-04-03 08:54:39,389 INFO [LOGGER] <?xml version="1.0" encoding="UTF-8" standalone="yes"?><event><body>&amp;lt;UId&amp;gt;904c-be-4e-bbda-3e62&amp;lt;/UId&amp;gt;&amp;lt;</body></event>
2013-04-03 08:54:34,979 INFO [LOGGER] <?xml version="1.0" encoding="UTF-8" standalone="yes"?><event><body>&amp;lt;UId&amp;gt;edfc-fr-5e-bced-3443&amp;lt;/UId&amp;gt;&amp;lt;</body></event>
2013-04-03 08:55:19,569 INFO [LOGGER] <?xml version="1.0" encoding="UTF-8" standalone="yes"?><event><body>&amp;lt;UId&amp;gt;edfc-fr-5e-bced-3443&amp;lt;/UId&amp;gt;&amp;lt;</body></event>
将提取我认为您关心的信息:

$ gawk -f tst.awk file
904c-be-4e-bbda-3e62 2013-04-03 08:54:19,989
904c-be-4e-bbda-3e62 2013-04-03 08:54:39,389
edfc-fr-5e-bced-3443 2013-04-03 08:54:34,979
edfc-fr-5e-bced-3443 2013-04-03 08:55:19,569
剩下的是简单的数学,对吗?并在这个awk脚本中执行它-不要将awk输出管道化到某个愚蠢的shell循环

扩展解决方案:

script.awk的内容 测试:修改了测试guid的顺序
$cat log.file
2013-04-03 08:54:19989信息[记录器]&;书信电报;UId&;燃气轮机;904c-be-4e-bbda-3e62&;lt/UId&;燃气轮机&;书信电报;
2013-04-03 08:54:34979信息[记录器]&;书信电报;UId&;燃气轮机;edfc-fr-5e-bced-3443和;lt/UId&;燃气轮机&;书信电报;
2013-04-03 08:54:39389信息[记录器]&;书信电报;UId&;燃气轮机;904c-be-4e-bbda-3e62&;lt/UId&;燃气轮机&;书信电报;
2013-04-03 08:55:19569信息[记录器]&;书信电报;UId&;燃气轮机;edfc-fr-5e-bced-3443和;lt/UId&;燃气轮机&;书信电报;
$awk-f script.awk log.file
904c-be-4e-bbda-3e62 0h:0m:20s
edfc-fr-5e-bced-3443 0h:0m:45s

使用更强大的工具,比如Python,怎么样?用
awk
/
sed
/
bash
/…这样做有点疯狂,我不知道…我看不到响应时间。那是
989
389
?但是您可以只使用两个24长度的数组。一个做加法,一个做计数。这将有助于获得所需的输出,使其更加清晰。@random\u你的问题听起来像是“我不懂Python,请给我写一些代码”。这不是一个很好的问题,所以,你可能应该雇佣一个程序员。这是简单的文本处理,你不需要Python,这是awk发明的唯一一件事,而且做得很好。它加入了所有其他的shell工具和构造,使您的代码变得如此混乱。谢谢Jaypal!我试图理解AWK gensub,我观察到我的日志文件中有嵌套的XML。另一个条件是:这些UID应该成对出现,以表明请求已完成。如果日志中只有一个uid,我不需要响应时间。Jaypal,有没有办法以毫秒为单位计算响应时间。08:54:19.989这里989以毫秒为单位。谢谢Ed,我正在尝试了解gensub的工作原理,如果它有帮助,我会发表评论Eded,一个问题-我的日志文件有一些不需要的行。如何过滤它们,或者更清楚地说,我需要在mcat test.log | grep INFO | awk-f tst.awk>UID.log上使用UID行更新您的问题,以显示您真实、有代表性的输入和预期的输出。从您的评论中不清楚您想要什么,例如,您想选择只包含单词INFO的行还是符合描述UID或其他内容的某种模式的行?对于gensub()-它基本上像sed一样工作,请阅读手册页。从日志文件添加了请求和响应
$ cat tst.awk
{
    date = $1
    time = $2
    guid = gensub(/.*;gt;([^&]+).*/,"\\1","")

    print guid, date, time
}
$ gawk -f tst.awk file
904c-be-4e-bbda-3e62 2013-04-03 08:54:19,989
904c-be-4e-bbda-3e62 2013-04-03 08:54:39,389
edfc-fr-5e-bced-3443 2013-04-03 08:54:34,979
edfc-fr-5e-bced-3443 2013-04-03 08:55:19,569
function parse_time (date, time,        newtime) {
    gsub(/-/, " ", date)
    gsub(/:/, " ", time)
    gsub(/,.*/, "", time)
    newtime = date" "time
    return newtime
}

(gensub(/.*;gt;([^&]+).*/,"\\1","") in starttime) {
    etime = parse_time($1, $2)
    endtime[gensub(/.*;gt;([^&]+).*/,"\\1","")] = etime
    next
}
{
    stime = parse_time($1, $2)
    starttime[gensub(/.*;gt;([^&]+).*/,"\\1","")] = stime
}

END {
    for (x in starttime) {
        for (y in endtime) {
            if (x==y) {
                diff = mktime(endtime[x]) - mktime(starttime[y])
                diff = sprintf("%dh:%dm:%ds",diff/(60*60),diff%(60*60)/60,diff%60)
                print x, diff
                delete starttime[x]
                delete endtime[y]
             }
        }
    }
}
$ cat log.file 
2013-04-03 08:54:19,989 INFO [LOGGER] <?xml version="1.0" encoding="UTF-8" standalone="yes"?><event><body>&amp;lt;UId&amp;gt;904c-be-4e-bbda-3e62&amp;lt;/UId&amp;gt;&amp;lt;</body></event>
2013-04-03 08:54:34,979 INFO [LOGGER] <?xml version="1.0" encoding="UTF-8" standalone="yes"?><event><body>&amp;lt;UId&amp;gt;edfc-fr-5e-bced-3443&amp;lt;/UId&amp;gt;&amp;lt;</body></event>
2013-04-03 08:54:39,389 INFO [LOGGER] <?xml version="1.0" encoding="UTF-8" standalone="yes"?><event><body>&amp;lt;UId&amp;gt;904c-be-4e-bbda-3e62&amp;lt;/UId&amp;gt;&amp;lt;</body></event>
2013-04-03 08:55:19,569 INFO [LOGGER] <?xml version="1.0" encoding="UTF-8" standalone="yes"?><event><body>&amp;lt;UId&amp;gt;edfc-fr-5e-bced-3443&amp;lt;/UId&amp;gt;&amp;lt;</body></event>
$ awk -f script.awk log.file 
904c-be-4e-bbda-3e62 0h:0m:20s
edfc-fr-5e-bced-3443 0h:0m:45s