Organização de texto em arquivo de log

1. Organização de texto em arquivo de log

jessica almeida tavares
jessica.tavares

(usa CentOS)

Enviado em 25/10/2015 - 20:29h

Oi pessoal,

Preciso reorganizar um arquivo de Log com 100.000.linhas, separando em linhas com os campo separados por ( ; )

Fiz este código, mas não consigo reorganizar no modelo:

Número do Terminal, Data, Hora e Minuto da transação, número da transação.

Ordem no arquivo:
Número da Transação: Campos de 1 a 5
Data da Transação: Campos de 6 a 15
Hora da Transação: Campos de 16 a 17
Minuto da Transação: Campos de 18 a 19
Segundos da Transação: Campos de 20 a 21
Número do Terminal: Campos de 22 a 25

parte do arquivo:

105222014-11-151157040946 238452014-11-150815260863 105872014-11-151751140483 200542014-11-150120100024 090382014-11-152052560305 232142014-11-152347440326

o que eu fiz:
#!/bin/bash

$FILE=transacoes.txt

if [ -e "$FILE" ] ; then
echo "O arquivo existe!"
else
echo "O arquivo não existe!"
fi

CONTEUDO=$(cat /home/jessica/Documentos/transacoes.txt)

cat transacoes.txt | while read line

do
TERM=$(echo$line | cut -c1-5)
DATA=$(echo$line | cut -c6-15)
HORA=$(echo$line | cut -c16-17)
MINU=$(echo$line | cut -c18-19)
SEGU=$(echo$line | cut -c20-21)
TRAN=$(echo$line | cut -c22-25)
echo$line >> $resultado.txt
done



  


2. Re: Organização de texto em arquivo de log

Wellingthon Dias Queiroz - @tonyhts
tonyhts

(usa Arch Linux)

Enviado em 26/10/2015 - 17:38h

Olá,

No exemplo que postou, não tem 25 campos e não são separados por (ponto e virgula), OK, Acredito que foi para ilustrar.

o Script abaixo está usando o caractere ";" como separador de campos.

OBS:: Vc pode informar o nome arquivo de entrada (aquele que tem os logs brutos) e o arquivo de saida (arquivo tratado final), caso não seja informado, o script assumir o nome padrão.
Por exemplo:
./script.sh arquivo_entrada arquivo_saida.txt 


Vamos ao script:
#!/bin/bash
#
#
# Script Criado para ajudar um usuário no VOl.
#
# Trata e ordena arquivo de log
#
# Uso:
# ./script.sh arquivo_origem arquivo_saida
#
#


# Arquivo de entrada é recebido como primeiro argumento/parâmetro, caso não seja informado, o nome padrão é assumido (transacoes.txt)
log_source=$1
if [ -z $log_source ]
then
log_source='transacoes.txt'
fi

# Arquivo de saída é recebido como segundo argumento/parâmetro, caso não seja informado, o nome padrão é assumido (log_tratado.txt)
final=$2
if [ -z $final ]
then
final='log_tratado.txt'
fi

#Inicializando contador
count=1

#Inicilizando arquivo e gravando cabeçalho
echo -e "Inicio do log :: $(date)\n\n" > $final

#LOOP - para cada linha encontrada no arquivo $log_source, ela é tratada e dividida em blocos compostos de 7 linhas com seus respectivos rótulos.
while read linha
do
clear
echo -e " Executando Transação: $count de $(cat $log_source | wc -l)"
echo -e "Transação: $count" >> $final
echo -e "Número da Transação: $(echo "$linha | awk -F";" '{print$1";"$2";"$3";"$4";"$5}')" >> $final
echo -e "Data da Transação: $(echo "$linha | awk -F";" '{print$6";"$7";"$8";"$9";"$10";"$11";"$12";"$13";"$14";"$15}')" >> $final
echo -e "Hora da Transação: $(echo "$linha | awk -F";" '{print$16";"$17}')" >> $final
echo -e "Minuto da Transação: $(echo "$linha | awk -F";" '{print$18";"$19}')" >> $final
echo -e "Segundos da Transação: $(echo "$linha | awk -F";" '{print$20";"$21}')" >> $final
echo -e "Número do Terminal: $(echo "$linha | awk -F";" '{print$22";"$23";"$24";"$25}') \n\n" >> $final
count=$(($count+1))
done <$log_source


Espero que ajude.

Abs
---
Eu Acredito, que ás vezes são as pessoas que ninguém espera nada que fazem as coisas que ninguém consegue imaginar.

--- Mestre dos Mestres - Alan Turing ---


3. Re: Organização de texto em arquivo de log

DAVISON MARCEL PASQUALINI
fdmarp

(usa Debian)

Enviado em 30/10/2015 - 18:22h

Não sei se eu entendi bem, mas me parecece que o que você quer na verdade é só separar os campos com ";" ... é isso?
Utilizando o seu loop seria assim:

#=======================original=====
cat transacoes.txt | while read line
do
TERM=$(echo $line | cut -c1-5)
DATA=$(echo $line | cut -c6-15)
HORA=$(echo $line | cut -c16-17)
MINU=$(echo $line | cut -c18-19)
SEGU=$(echo $line | cut -c20-21)
TRAN=$(echo $line | cut -c22-25)
echo "${TERM};$28/12/2006;${HORA};${MINU};${SEGU};${TRAN}" >> resultado.txt
done
#=================================

Neste caso só mudei o seu echo final, mas .... como o arquivo tem uma quantidade razoável de linhas ... você pode utilizar um loop mais otimizado, já que você não usa as variáveis para mais nada mesmo.

#========================otimizado==
while read line
do
echo "${line:0:5};${line:5:10};${line:15:2};${line:17:2};${line:19:2};${line:21:4}" >> resultado.txt
done < transacoes.txt
#=================================

Parece bobagem, mas fiz um teste na minha máquina com 10.000 registros e o resultado foi:
loop1: 2 minutos 16 segundos
loop2: 2 segundos

Mas se não for isso explica melhor ... tá um pouco confuso




4. Resp: Organização de texto em arquivo de log

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 12/11/2015 - 18:13h

Boa tarde Jessica.
A solução que encontrei foi a seguinte:

Com base nas informações passadas...
Número da Transação: Campos de 1 a 5
Data da Transação: Campos de 6 a 15 (+1)
Hora da Transação: Campos de 16 a 17 (+2)
Minuto da Transação: Campos de 18 a 19 (+3)
Segundos da Transação: Campos de 20 a 21 (+4)
Número do Terminal: Campos de 22 a 25

Gerei o seguinte:

1º COMANDO
CAMPOS=(5 16 19 22 25 30)

Obs: O Nº aumenta a medida que é inserido o ";"

2º COMANDO
for ((X=0;X<${#CAMPOS[@]};X++));do echo -e $(for ((A=0;A<"${CAMPOS[$X]}";A++));do echo -n "."; done) >> CAMPOS.txt;done

3º COMANDO
for ((X=1;X<=6;X++));do VAR=$(sed -n "$X"p CAMPOS.txt);sed -i 's/\('$VAR'\)/&\;/' FILE.txt; done

Breve explicação:
1º COMANDO => Campos onde você deseja incluir ";"
2º COMANDO => Gera o arquivo CAMPOS.txt com o seguinte conteúdo (cada ponto é um caractere):

cat CAMPOS.txt
.....
................
...................
......................
.........................
..............................

3º COMANDO => Pega cada linha de CAMPOS.txt, atribuo o conteúdo a $VAR. No sed, caso com $VAR, repito $VAR e coloco ";"

FILE.txt => Arquivo que será alterado

Antes
105222014-09-151157040946
105222014-10-151157040946
105222014-11-151157040946
105222014-12-151157040946
105222014-13-151157040946
105222014-14-151157040946

Depois
10522;2014-09-15;11;57;04;0946;
10522;2014-10-15;11;57;04;0946;
10522;2014-11-15;11;57;04;0946;
10522;2014-12-15;11;57;04;0946;
10522;2014-13-15;11;57;04;0946;
10522;2014-14-15;11;57;04;0946;

Resumindo . . .
Os 03 comandos citados acima solucionam o problema.
Em tempo
Para manter uma cópia do seu arquivo, altere o 3º COMANDO, assim:
for ((X=1;X<=6;X++));do VAR=$(sed -n "$X"p CAMPOS.txt);sed -i.BACKUP 's/\('$VAR'\)/&\;/' FILE.txt; done

Espero ter ajudado...
Att.:
Marcelo Oliver

EDITADO :
Simplificando :

FILE01.txt # Seu arquivo de exemplo

#!/bin/bash

#1º Passo
#Um registro por linha (se for o caso)
sed -i 's/ /\n/g' FILE01.txt

#2º Passo
#Define campos
CAMPOS=(5 16 19 22 25 30)

#3ºPASSO
#Insere ";"
for ((X=0;X<${#CAMPOS[@]};X++));do
sed -i 's/\(.\)/&;/'${CAMPOS[$X]}'' FILE01.txt
done
exit 0

FILE01.txt alterado
10522;2014-11-15;11;57;04;0946;
23845;2014-11-15;08;15;26;0863;
10587;2014-11-15;17;51;14;0483;
20054;2014-11-15;01;20;10;0024;
09038;2014-11-15;20;52;56;0305;
23214;2014-11-15;23;47;44;0326;

Att.:
Marcelo Oliver







Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts