我有一个这种格式的文件:
开始跟踪进程17134 17136 17137 17138 (/usr/sbin/nginx)... [1465461983910514] pid:17136 获取/ 总计:244us,accept() ~ header-read:19us,重写:9us,预访问:13us,访问:9us,内容:137us 上游:连接=0us,首字节时间=0us,读取=0us [1465461983911223] pid:17136 GET /sfi9876 总计:110us,accept() ~ header-read:12us,重写:13us,预访问:20us,访问:13us,内容:137us 上游:连接=0us,首字节时间=0us,读取=0us [1465461983911949] pid:17136 GET /lpt9 总计:127us,accept() ~ header-read:14us,重写:18us,预访问:28us,访问:20us,内容:137us 上游:连接=0us,首字节时间=0us,读取=0us [1465461983912121] pid:17136 GET /~sfi9876 总计:127us,accept() ~ header-read:11us,重写:24us,预访问:37us,访问:26us,内容:137us 上游:连接=0us,首字节时间=0us,读取=0us
我想使用每个请求所花费的总时间对此日志进行排序,使其看起来像这样:
开始跟踪进程17134 17136 17137 17138 (/usr/sbin/nginx)... [1465461983911223] pid:17136 GET /sfi9876 总计:110us,accept() ~ header-read:12us,重写:13us,预访问:20us,访问:13us,内容:137us 上游:连接=0us,首字节时间=0us,读取=0us [1465461983911949] pid:17136 GET /lpt9 总计:127us,accept() ~ header-read:14us,重写:18us,预访问:28us,访问:20us,内容:137us 上游:连接=0us,首字节时间=0us,读取=0us [1465461983912121] pid:17136 GET /~sfi9876 总计:127us,accept() ~ header-read:11us,重写:24us,预访问:37us,访问:26us,内容:137us 上游:连接=0us,首字节时间=0us,读取=0us [1465461983910514] pid:17136 获取/ 总计:244us,accept() ~ header-read:19us,重写:9us,预访问:13us,访问:9us,内容:137us 上游:连接=0us,首字节时间=0us,读取=0us
因此,请建议一些使用 bash 脚本来执行此操作的方法。
答案1
您可以使用普通while read
循环,然后read
在循环内使用两次来读取每组中的第二行和第三行。
while read -r line1; do
read -r line2
read -r line3
...
done
答案2
您可以循环直到 EOF,读取每个条目(3 行),使用类似的内容提取时间headTime=$(echo $line|cut -d':' -f2|cut -du)
并将它们添加在一起,如total=$(expr $headTime + $rewriteTime + ...)
.
然后,您可以将每组 3 行输出为以总计开头的单行(用于排序),并放置行分隔符(例如:)|
,以便您可以在排序后轻松地将它们分开。然后,您显然会对临时文件进行排序,将行拆分回来:sort -n tempFile|sed "s/|/\n/g"
。