Mostrando postagens com marcador For. Mostrar todas as postagens
Mostrando postagens com marcador For. Mostrar todas as postagens

terça-feira, 3 de março de 2015

For + Awk - Parte 2

Problema: Dado um diretório, contendo diversos subdiretórios, que por sua vez contém diversos arquivos compactados e você precisa descompactar os arquivos de alguns destes diretórios.

Alternativa de solução: Vasculhar todos os diretórios, selecionando apenas os subdiretórios que interessam através, por exemplo de um awk.

Exemplo:

for k in $(for i in $(find /dados/ -type d);do for j in $(ls $i/*.gz); do echo $j | awk 'BEGIN{FS="/"}{if ($7 >= "20150106" && $7 <= "20150115"){print $0;}}' ;done; done); do gzip -dc $k; done | gzip > /dados/arquivo_20150106_20150115.txt.gz

Neste exemplo, eu vasculho todos os subdiretórios cujo nome esteja entre 20150106 e 20150115, descompacto estes arquivos e os compacto em uma nova saída.



domingo, 23 de novembro de 2014

Nohup + For

Como o comando nohup espera apenas um comando, para usar um nohup com um processamento mais 'complexo', deve-se usar o comando sh/bash (shell) com a opção -c, seguido pelo comando 'complexo'. Veja a sintaxe:

nohup sh/bash -c 'comando1; comando2; comandoN' &

Exemplo:

nohup sh -c 'for i in $(find . -type d); do for j in $(find $i/*.gz -type f); do gzip -dc $j | ./exec_script_001.pl; done; done > log/exec_script_001.pl.log' &

Outra maneira de contornar o problema é transformar sua série de comandos em um script e chamar apenas o script com nohup.

quinta-feira, 28 de agosto de 2014

Descompactar arquivo(s) com uma máscara pré-determinada de diversos arquivos ZIP

Dado um diretório contando diversos arquivos compactados (zip) - por exemplo, um diretório contendo backups diários - extrair de alguns destes arquivos, arquivos que correspondam a uma máscara específica.
Para isto, podemos combinar ao unzip, os comandos for e ls, como abaixo:

Sintaxe:
for i in $(ls <relacao_arquivos>); do unzip -j $i <mascara_arquivo>; done

Exemplo:
for i in $(ls /backup_diario/201408*.zip); do unzip -j $i PROCESSAMENTO/2014????txt; done

No exemplo acima, são extraídos dos arquivos zip, que atendem a máscara 201408*.zip, apenas os arquivos que originalmente quando compactados estavam na pasta PROCESSAMENTO e que atendem a máscara informada (2014????.txt). Os arquivos são extraídos sem o diretório original e colocados no diretório aonde o comando está sendo executado (opção -j).

terça-feira, 17 de junho de 2014

Bash (For) + Gzip + Loader Mysql

Problema: Efetuar o LOADER em banco de dados MySQL de arquivos compactados em inúmeros subdiretórios de um diretório pai.

Sugestão de solução: Fazer um (bash) FOR primeiro para a leitura dos subdiretórios, seguido do (bash) FOR para a obtenção dos arquivos, descompactar o arquivo, efetuar o loader e compactar o arquivo.

Sintaxe:

for j in $(ls -d <diretório_pai>*); do for i in $(ls $j/*gz); do tam=${#i}; arq=${i:0:tam-3}; dir=${j:33}; gzip -d $i ; echo 'LOAD DATA LOCAL INFILE "'$arq'" INTO TABLE <tabela> FIELDS TERMINATED BY "'''\''" LINES TERMINATED BY "\n" set filename="'$arq'", directory="'$dir'";' | mysql -u<user> -p<password> -qs; gzip $arq; done; done 

onde:
<diretório_pai> - caminho completo do diretório pai
<tabela> - tabela MySQL aonde os dados serão carregados
<user> - usuário MySQL
<password> - password do <user> MySQL

Opção mais completa - Tratar antes o arquivo (com um script perl, por exemplo) e verificar se houve erros na carga dos arquivos gerando um log

Sintaxe:


for j in $(ls -d <diretório_pai>*); do for i in $(ls $j/*gz); do tam=${#i}; arq=${i:0:tam-3}; arq_novo=$arq.new; dir=${j:33}; gzip -d $i ; <script> $arq > $arq_novo ; echo 'LOAD DATA LOCAL INFILE "'$arq_novo'" INTO TABLE <tabela> FIELDS TERMINATED BY "'''\''" LINES TERMINATED BY "\n" (<col1>, <col2>,..,<col3>) set filename="'$arq'", directory="'$dir'"; show warnings;' | mysql -u<user> -p<password> -qs; gzip $arq; rm -fr $arq_novo; done; done > <arquivo_log> &


onde:
<diretório_pai> - caminho completo do diretório pai
<script> - script a ser executado
<tabela> - tabela MySQL aonde os dados serão carregados
<col1>, <col2>, .., <coln> - colunas da <tabela>
<user> - usuário MySQL
<password> - password do <user> MySQL
<arquivo_log> - nome do arquivo log

sexta-feira, 21 de março de 2014

Bash - Descompactar arquivos em Subdiretórios

Boa e velha dica para descompactar arquivos em subdiretórios!
Basta usar os comandos FOR + FIND + GZIP

Sintaxe:

for i in $(find -type f -print); do gzip -d $i; done

Exemplo:

for i in $(find 20140* -type f -print); do gzip -d $i; done

sexta-feira, 22 de novembro de 2013

Descompactar Arquivos TAR com GZ

Super dica enviada pelo Jorge :-)

Recebi alguns pacotes de arquivos compactados (TAR). Dentro deles uma série de arquivos GZ.

Dado o volume, eu não posso simplesmente descompactar tudo para depois aplicar meu filtro. Preciso ir descompactando tudo pra saída padrão e filtrando.

Pra isso:

for i in $(tar -tf ARQ.tar ; do tar -xOf ARQ.tar $i | gzip -dc | ./meufiltro; done | gzip > filtrado.txt.gz


quinta-feira, 28 de junho de 2012

Shell - renomear vários arquivos

Em ambiente Unix-like, para renomear vários arquivos uma boa dica é usar o comando script for com awk.

Sintaxe:
for i in (ls <máscara_arquivos>); do echo $i  | awk '{a=$0; b=a; gsub(".txt",".pl",b); print "mv " a " "b;}' | bash; done

Exemplo:

for i in $(ls *.txt); do echo $i | awk '{a=$0; b=a; gsub(".txt",".pl",b); print "mv " a " "b;}' | bash; done

sexta-feira, 13 de abril de 2012

Bash FOR + AWK

Esses tempos me deparei com a necessidade de concatenar diversos arquivos de um diretório, com base em um filtro, que estavam, originalmente, compactados, adicionando ao ínicio da linha um sequencial e ao fim da linha o nome do arquivo de origem e número da linha neste arquivo.

Para isso usei:

for i in $(ls arquivos/*.gz); do gzip -dc $i > $i.temp; awk 'substr($0, 34,6)=="201111"{print $0 "|" FILENAME "|" NR}' $i.temp;rm $i.temp; done | awk 'BEGIN{c=1}{printf ("%010d%s\n", c++, $0)}' > arquivo_concatenado.txt

Onde:
for i in $(ls arquivos/*.gz) #itens de (ls arquivos/*.gz) para a variavel i
do #início do laço
gzip -dc $i > $i.temp; #descompacta o arquivo para nomedoarquivo.temp
awk 'substr($0, 34,6)=="201111"{print $0 "|" FILENAME "|" NR}' $i.temp; #com o awk filtra-se a linhas onde o substring atenda a condição desejada (substr($0, 34,6)=="201111") e imprime-se o conteúdo da linha + pipe + NOME DO ARQUIVO + pipe + NUMERO DA LINHA
rm $i.temp; #remove o arquivo temporario criado na descompactação
done < fim do laço

[]'s