Como colocar todos os arquivos de log em um intervalo de datas

4

Eu tenho arquivos de log que são nomeados da seguinte maneira:

localhost_log_file.2017-09-01.txt
localhost_log_file.2017-09-02.txt
....

localhost_log_file.2017-10-30.txt

Em outras palavras, cada arquivo de log tem o seguinte formato:

localhost_log_file.YYYY-MM-DD.txt

Eu quero catar todos os arquivos de log entre as datas de 2017-09-03 e 2017-10-08, ou seja, cada arquivo de log começando de localhost_log_file.2017-09-03.txt a localhost_log_file.2017-10-08.txt .

Atualmente, o que faço é produzir três arquivos intermediários, executando separadamente cada um dos seguintes comandos:

for((i=3;i<=9;i++)) do cat localhost_log_file.2017-09-0$i.txt >> log1.csv ; done;

for((i=10;i<=30;i++)) do cat localhost_log_file.2017-09-$i.txt >> log2.csv ; done;

for((i=1;i<=8;i++)) do cat localhost_log_file.2017-10-0$i.txt >> log3.csv ; done;

Então eu combino os arquivos intermediários da seguinte forma:

cat log1.csv log2.csv log3.csv> totallog.csv

Existe uma maneira melhor de fazer isso?

    
por Ricky 09.11.2017 / 04:52

5 respostas

8

Que tal usar o utilitário date para percorrer o intervalo de datas em que você está interessado? Aqui está o que isso pode parecer para o seu exemplo:

# Set the date counter to the start date
d=2017-09-03

# Iterate until we reach the end date (i.e. the date after the last date we want)
while [ "$d" != 2017-10-09 ]; do

    # cat each file
    cat "localhost_log_file.${d}.txt";

    # Increment the date counter
    d="$(date -I -d "$d + 1 day")";

done

Veja isto para mais informações:

Como alternativa, você pode passar os resultados do loop para o comando cat em vez de chamar cat no corpo do loop.

Veja como isso pode parecer usando a substituição de comando:

d=2017-09-03
cat $(while [ "$d" != 2017-10-09 ]; do
    echo "localhost_log_file.${d}.txt";
    d="$(date -I -d "$d + 1 day")";
done)

E aqui está a mesma coisa usando um pipe e xargs :

d=2017-09-03
while [ "$d" != 2017-10-09 ]; do
    echo "localhost_log_file.${d}.txt";
    d="$(date -I -d "$d + 1 day")";
done | xargs cat
    
por 09.11.2017 / 04:58
12

Você pode aninhar a expansão de chaves.

Curto e doce:

cat localhost_log_file.2017-{09-{03..30},10-{01..08}}.txt > totallog.csv

Observe que alguns sistemas, como o macOS, usam uma versão mais antiga do Bash, onde isso não funciona, pois os zeros à esquerda são removidos das sequências inteiras da expansão de contraventamento. Para Linux isso funciona bem.

    
por 09.11.2017 / 05:59
3

data de uso:

for i in {0..35}; do
     cat localhost_log_file.$(date +%F -d "2017-09-03 + $i day").txt
done > totallog.csv
    
por 09.11.2017 / 04:59
1

Melhor é subjetivo, mas você pode usar a expansão de chaves para ambos

cat localhost_log_file.2017-09-{03..09}.txt > log1.csv

e

cat log{1..3} > totallog.csv

Supondo que você queria manter o log? Arquivos .csv

    
por 09.11.2017 / 05:56
0

Use este comando:

ls | sort | while read i; do  if ([ "$i" \> "localhost_log_file.2017-09-03.txt" ] || [ "$i" == "localhost_log_file.2017-09-03.txt" ]) && ([ "$i" \< "localhost_log_file.2017-10-08.txt" ] || [ "$i" == "localhost_log_file.2017-10-08.txt" ]); then cat $i >> totallog.csv ; fi ; done

Você tem que executá-lo assim

ls | sort | while read i pressione Enter
do pressione Enter
if ([ "$i" \> "localhost_log_file.2017-09-03.txt" ] || [ "$i" == "localhost_log_file.2017-09-03.txt" ]) && ([ "$i" \< "localhost_log_file.2017-10-08.txt" ] || [ "$i" == "localhost_log_file.2017-10-08.txt" ]) aperte enter then pressione Enter
cat $i >> totallog.csv pressione Enter
fi pressione Enter
done pressione Enter

    
por 09.11.2017 / 11:48

Tags