Adicione hora de todos os arquivos de log usando o bash

0

Eu quero extrair tempo de todos os meus arquivos .log e adicionar todos esses tempos em uma única entidade. Meus arquivos de log são colocados em diretórios aninhados.

Estrutura de diretórios para meus arquivos de log:

|-- temp-system
|   |-- bash
|   |   |-- bash-4.3-branch_update-5.patch
|   |   |-- build.log
|   |   |-- build.sh
|   |   '-- DONE
|   |-- binutils
|   |   |-- build.log
|   |   |-- build.sh
|   |   '-- DONE
|   |-- build-variables
|   |   |-- build.log
|   |   |-- build.sh
|   |   '-- DONE
|   |-- bzip2
|   |   |-- build.log
|   |   |-- build.sh
|   |   '-- DONE
|   |-- check
|   |   |-- build.log
|   |   |-- build.sh
|   |   '-- DONE
|   |-- cloog
|   |   |-- build.log
|   |   |-- build.sh
|   |   '-- DONE
|   |-- gettext
|   |   |-- build.log
|   |   |-- build.sh
|   |   '-- DONE
|-- build-system
|   |-- gcc
|   |   |-- build.log
|   |   |...

Snippet dos meus arquivos de log:

are/man/man1'
make[2]: Leaving directory '/tmp/panda64/temp-system/texinfo/texinfo-5.2/man'
make[1]: Leaving directory '/tmp/panda64/temp-system/texinfo/texinfo-5.2/man'
make[1]: Entering directory '/tmp/panda64/temp-system/texinfo/texinfo-5.2'
make[2]: Entering directory '/tmp/panda64/temp-system/texinfo/texinfo-5.2'
make[2]: Nothing to be done for 'install-exec-am'.
make[2]: Nothing to be done for 'install-data-am'.
make[2]: Leaving directory '/tmp/panda64/temp-system/texinfo/texinfo-5.2'
make[1]: Leaving directory '/tmp/panda64/temp-system/texinfo/texinfo-5.2'
/tmp/panda64/temp-system/texinfo

real    1m59.973s
user    1m26.352s
sys     0m11.820s

Cada arquivo de log tem as três últimas linhas real , user e sys . Eu quero extrair todos estes fora dos meus arquivos de log e adicioná-los e saída em um formato HH:MM:SS . Eu estava tentando conseguir isso usando cat e grep , mas não consegui acertar o regex .

UPDATE

Para percorrer o diretório, estou usando o seguinte código:

list=(temp-system build-system)
for direcs in ${list[@]}; do
    case $direcs in
        temp-system )
            pushd $direcs
                _list1=(bash binutils build-variables)
                for subdirecs in ${_list1[@]}; do
                    case $subdirecs in
                        * )
                            # execute code to add the time
                            # and later add this with other
                            # time calculated from other directories
                            ;;
                    esac
                done
            popd;;
    esac
done
    
por Abhimanyu Saharan 28.05.2016 / 05:20

2 respostas

1

Em vez desse enorme script para percorrer os arquivos, você pode simplesmente encontrar:

find /var/log -name *.log -exec ls {} \;

Substitua o caminho e o 'ls' no -exec para atender às suas necessidades.

Quanto ao grepping, você pode fazer algo como:

grep "^real\t" time.txt | awk '{ print  $NF }'

Não consigo criar uma solução bonita para formatá-lo.

    
por 28.05.2016 / 09:43
0

Depois de ter um arquivo contendo tempos no formulário 1m59.973s (por exemplo, a saída de resposta de Mikael Kjær ), você pode transformá-los em uma única soma para bc (1) :

( cat alltimes.log | sed 's_h_*3600+_;s_m_*60+_;s_s_+_' | tr -d '\n' ; echo 0 ) | bc

Isso imprime um número de segundos (incluindo casas decimais). Então, bash (cuja expansão aritmética não lida com decimais) pode dividi-lo e reformatá-lo:

TOTAL='( cat alltimes.log | sed 's_h_*3600+_;s_m_*60+_;s_s_+_' | tr -d '\n' ; echo 0 ) | bc'
INT=${TOTAL%.*}
DEC=${TOTAL#*.}
H=$((INT/3600))
M=$((INT/60%60))
S=$((INT%60))
printf %02i:%02i:%02i.%s $H $M $S $DEC
    
por 09.06.2016 / 17:52