Lê n linhas de uma vez em um loop usando o script bash

1

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.

    
por tom 09.06.2016 / 13:37

2 respostas

0

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
    
por 09.06.2016 / 21:33
0

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" .

    
por 09.06.2016 / 14:04