使用 bash 脚本循环读取 n 行

使用 bash 脚本循环读取 n 行

我有一个这种格式的文件:

开始跟踪进程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"

相关内容