Você pode usar um loop while read
normal e usar read
duas vezes no loop para ler a segunda e a terceira linha de cada conjunto.
while read -r line1; do
read -r line2
read -r line3
...
done
Eu tenho um arquivo neste formato:
Start tracing process 17134 17136 17137 17138 (/usr/sbin/nginx)... [1465461983910514] pid:17136 GET / total: 244us, accept() ~ header-read: 19us, rewrite: 9us, pre-access: 13us, access: 9us, content: 137us upstream: connect=0us, time-to-first-byte=0us, read=0us [1465461983911223] pid:17136 GET /sfi9876 total: 110us, accept() ~ header-read: 12us, rewrite: 13us, pre-access: 20us, access: 13us, content: 137us upstream: connect=0us, time-to-first-byte=0us, read=0us [1465461983911949] pid:17136 GET /lpt9 total: 127us, accept() ~ header-read: 14us, rewrite: 18us, pre-access: 28us, access: 20us, content: 137us upstream: connect=0us, time-to-first-byte=0us, read=0us [1465461983912121] pid:17136 GET /~sfi9876 total: 127us, accept() ~ header-read: 11us, rewrite: 24us, pre-access: 37us, access: 26us, content: 137us upstream: connect=0us, time-to-first-byte=0us, read=0us
Eu quero classificar para esse log usando o tempo total gasto em cada solicitação para que fique assim:
Start tracing process 17134 17136 17137 17138 (/usr/sbin/nginx)... [1465461983911223] pid:17136 GET /sfi9876 total: 110us, accept() ~ header-read: 12us, rewrite: 13us, pre-access: 20us, access: 13us, content: 137us upstream: connect=0us, time-to-first-byte=0us, read=0us [1465461983911949] pid:17136 GET /lpt9 total: 127us, accept() ~ header-read: 14us, rewrite: 18us, pre-access: 28us, access: 20us, content: 137us upstream: connect=0us, time-to-first-byte=0us, read=0us [1465461983912121] pid:17136 GET /~sfi9876 total: 127us, accept() ~ header-read: 11us, rewrite: 24us, pre-access: 37us, access: 26us, content: 137us upstream: connect=0us, time-to-first-byte=0us, read=0us [1465461983910514] pid:17136 GET / total: 244us, accept() ~ header-read: 19us, rewrite: 9us, pre-access: 13us, access: 9us, content: 137us upstream: connect=0us, time-to-first-byte=0us, read=0us
Então, por favor, sugira alguma maneira de fazer isso usando um script bash.
Você poderia fazer um loop até EOF, lendo cada entrada (3 linhas), extrair os tempos com algo como headTime=$(echo $line|cut -d':' -f2|cut -du)
e adicioná-los juntos como total=$(expr $headTime + $rewriteTime + ...)
.
Em seguida, você poderia produzir cada grupo de 3 linhas como uma única linha começando com o total (para classificação) e colocando um separador de linha (ex: |
) para que você possa separá-las facilmente após a classificação. Então você obviamente classificaria o arquivo temporário, dividindo as linhas de volta: sort -n tempFile|sed "s/|/\n/g"
.
Tags shell-script