Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.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,我试图从日志文件中每小时计算平均响应时间,该日志文件有数百万条记录,下面是日志摘录 到目前为止,我正在尝试创建temproary文件,该文件将具有唯一id、开始时间和结束时间的行,之后,另一个脚本将在此临时文件上运行,以计算每个小时的平均响应时间 我的脚本需要一个多小时才能创建临时文件 我们有什么办法可以做得更快吗?或者更好的脚本,其执行时间更短。 注意:这些UNIQID不是按顺序出现的 log file format 2012-06-04 13:04:19,324 UNIQID1 2012-0

我试图从日志文件中每小时计算平均响应时间,该日志文件有数百万条记录,下面是日志摘录

到目前为止,我正在尝试创建temproary文件,该文件将具有唯一id、开始时间和结束时间的行,之后,另一个脚本将在此临时文件上运行,以计算每个小时的平均响应时间 我的脚本需要一个多小时才能创建临时文件

我们有什么办法可以做得更快吗?或者更好的脚本,其执行时间更短。 注意:这些UNIQID不是按顺序出现的

log file format
2012-06-04 13:04:19,324 UNIQID1
2012-06-04 13:04:20,120 UNIQID1
2012-06-04 13:05:19,324 UNIQID2
2012-06-04 13:06:20,120 UNIQID2
2012-06-04 13:07:19,324 UNIQID3
2012-06-04 13:08:20,120 UNIQID3
2012-06-04 13:08:49,324 UNIQID4
2012-06-04 13:09:50,120 UNIQID4
这是我的密码:

uids=`cat $i|grep "UNIQ" |sort -u` >> $log
for uid in ${uids}; do  
    count=`grep "$uid" test.log|wc -l`
    if [ "${count}" -ne "0" ]; then
        unique_uids[counter]="$uid"
        let counter=counter+1   
    fi   
done


echo ${unique_uids[@]}   
echo $counter  
echo " Unique No:" ${#unique_uids[@]}
echo uid StartTime EndTime" > $log

for unique_uids in ${unique_uids[@]} ; do
    responseTime=`cat $i|grep "${unique_uids}" |awk '{split($2,Arr,":|,"); print Arr[1]*3600000+Arr[2]*60000+Arr[3]*1000+Arr[4]}'|sort -n`
    echo $unique_uids $responseTime >> $log
done
谢谢你的时间

一些简单的修复:

  • 你不需要电话;只需将文件名用作
    grep
    的最后一个参数
  • 您不应该将值同时保存到文件和变量中;用快一点的。通常你不必使用这两种方法;而IFS=read-r日期时间id循环可能会更快
    • 一些简单的修复:

      • 你不需要电话;只需将文件名用作
        grep
        的最后一个参数
      • 您不应该将值同时保存到文件和变量中;用快一点的。通常你不必使用这两种方法;而IFS=read-r日期时间id循环可能会更快

        • 您的脚本有几个问题,我想您会发现下面的脚本更适合您的需要。首先,您不需要生成所有这些进程来完成这项工作——在awk中完成这项工作相当简单。此外,您发布的代码假定特定的UNIQID只会在同一天发生。如果你的记录从午夜一直到第二天,这个假设会引起很大的悲痛

          以下代码在
          awk
          脚本中执行您想要的操作。它假定您正在使用
          gawk
          (Gnu awk)。如果没有,您可以在web上找到mktime的
          awk
          实现


          您的脚本有几个问题,我想您会发现下面的脚本更适合您的需要。首先,您不需要生成所有这些进程来完成这项工作——在awk中完成这项工作相当简单。此外,您发布的代码假定特定的UNIQID只会在同一天发生。如果你的记录从午夜一直到第二天,这个假设会引起很大的悲痛

          以下代码在
          awk
          脚本中执行您想要的操作。它假定您正在使用
          gawk
          (Gnu awk)。如果没有,您可以在web上找到mktime的
          awk
          实现


          这属于codereview.stackexchange.com。您是否在使用Gnu awk的Linux系统上运行?这属于codereview.stackexchange.com。您是否在使用Gnu awk的Linux系统上运行?谢谢您的建议。是的,我同意,因为我对脚本编写还不熟悉,所以您可能会在代码中看到新手风格。我正在GNU AWK上使用。我会试试这个,让你知道结果Hi-Ram,我在运行这段代码时遇到了问题。我已经编写了这个test.awk,命令m使用的是:awk-f test.awk test.log>output.log实际上我正在使用另一个awk在日志文件中获取uid并将它们放入数组中。因此,在使用您的awk时,我无法将这些uid传递给您的awk。下面是获取uid uid的代码=
          cat$i|grep“Service”| awk'BEGIN{FS=“lt;”RS=“gt;”}{print$2;}| sort-u
          然后您是否只想让那些uid(即终止于
          |sort-u
          的命令的结果)成为您在日志文件中查找的uid?换句话说,就是那些你想要平均响应时间的UID。正确?正确的Ram。为什么我要这样做,因为这些日志包含嵌入的xml文件,我正在从xml中取出UID。希望我能把事情说清楚。谢谢谢谢你的建议。是的,我同意,因为我对脚本编写还不熟悉,所以您可能会在代码中看到新手风格。我正在GNU AWK上使用。我会试试这个,让你知道结果Hi-Ram,我在运行这段代码时遇到了问题。我已经编写了这个test.awk,命令m使用的是:awk-f test.awk test.log>output.log实际上我正在使用另一个awk在日志文件中获取uid并将它们放入数组中。因此,在使用您的awk时,我无法将这些uid传递给您的awk。下面是获取uid uid的代码=
          cat$i|grep“Service”| awk'BEGIN{FS=“lt;”RS=“gt;”}{print$2;}| sort-u
          然后您是否只想让那些uid(即终止于
          |sort-u
          的命令的结果)成为您在日志文件中查找的uid?换句话说,就是那些你想要平均响应时间的UID。正确?正确的Ram。为什么我要这样做,因为这些日志包含嵌入的xml文件,我正在从xml中取出UID。希望我能把事情说清楚。谢谢谢谢,我也会试试这个。谢谢,我也会试试这个。
          BEGIN {
            while (getline < UIDFILE) {
              x[$0] = 1;          # Awk will maintain these as an associative array, lookups are hashed
            }
          }
          
          
          {
            r = $NF;                  # Extract the unique ID from the record into r
            if (r in x) {             # If the UID is something we are interested in, then ...
              ts = $1 " " $2;         # concatenate these fields
              gsub ("[:-]", " ", ts); # Replace the : and - with spaces 
              gsub (",.*", "", ts);   # Remove everything after the comma
              # print ts, mktime(ts)  # If you want to see what mktime does 
          
              if (x[r] == "")         # First time seeing this unique ID?
                x[r] = mktime(ts);    # Store the timestamp
              else {                  # We're seeing it the second time
                now = mktime(ts)      # Keep track of the current log time 
                rt = now - x[r];      # Compute the delta
                delete (x[r])         # We don't need it any more
                # printf "Record <%s> has response time %f\n", r, rt;  # Print it out if you'd like
                hourrt += rt;         # Add it to this hour's total response time
                num++;                # And also keep track of how many records we have ending in this hour
                 if (now % 3600 == 0) {  # Have we switched to a new hour?
                    printf "Average response time = %f\n", hourrt / num;   # Dump the average
                    num = hourrt = 0;
                }
              }
            }
          }
          
          gawk -v UIDFILE=name_of_uid_file  -f scriptname.awk