quinta-feira, 27 de novembro de 2014

TRIM no AWK

Subfuncções TRIM para AWK

function ltrim(s) { sub(/^[ \t\r\n]+/, "", s); return s }
function rtrim(s) { sub(/[ \t\r\n]+$/, "", s); return s }
function trim(s) { return rtrim(ltrim(s)); }

Exemplo:

function ltrim(s) { sub(/^[ \t\r\n]+/, "", s); return s }
function rtrim(s) { sub(/[ \t\r\n]+$/, "", s); return s }
function trim(s) { return rtrim(ltrim(s)); }
BEGIN{OFS=";"}
{
print substr($0,466,32), substr($0,17,3), substr($0,191,3), substr($0,194,2), substr($0,187,2), substr($0,189,2), trim(substr($0,48,10)), substr($0,455,11), substr($0,177,5), substr($0,182,5), trim(substr($0,58,20)), trim(substr($0,98,32)), substr($0,500,3);
}

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.

sexta-feira, 17 de outubro de 2014

Oracle/PL-SQL - Delete com BULK

Para operações de delete em grandes tabelas, uma opção é utilizar o conceito de BULK o que garante não só uma melhor performance no DELETE com também diminui a quantidade de controles por causa dos COMMITs. Um exemplo seria:

CREATE OR REPLACE PROCEDURE PR_PURGE IS

CURSOR cdr_cur IS
SELECT ROWID FROM <TABELA> c where <CONDICAO>;

TYPE cdr_data IS TABLE OF ROWID INDEX BY BINARY_INTEGER;
cdr cdr_data;

BEGIN
OPEN cdr_cur;
LOOP
     cdr.DELETE;

     FETCH cdr_cur BULK COLLECT INTO cdr LIMIT <LIMITE>;  --LIMITE

     IF cdr.COUNT>0 THEN
          FORALL j IN 1..cdr.COUNT
          DELETE FROM <TABELA> WHERE ROWID=cdr(j);
          COMMIT;
     ELSE
          EXIT;
     END IF;
END LOOP;

CLOSE cdr_cur;
COMMIT;

EXCEPTION
     WHEN OTHERS THEN
          IF cdr_cur%ISOPEN THEN CLOSE cdr_cur; END IF;
     
END;

onde:
<TABELA> - Tabela que será manipulada
<CONDICAO> - Condição de pesquisa/seleção
<LIMITE> - Quantidade de registros transacionados por vez

exemplo:

CREATE OR REPLACE PROCEDURE PR_PURGE IS

CURSOR cdr_cur IS
SELECT ROWID FROM TABELA_A c where c.DATA > '20141201';

TYPE cdr_data IS TABLE OF ROWID INDEX BY BINARY_INTEGER;
cdr cdr_data;

BEGIN
OPEN cdr_cur;
LOOP
     cdr.DELETE;

     FETCH cdr_cur BULK COLLECT INTO cdr LIMIT 100000;

     IF cdr.COUNT>0 THEN
          FORALL j IN 1..cdr.COUNT
          DELETE FROM TABELA_A WHERE ROWID=cdr(j);
          COMMIT;
     ELSE
          EXIT;
     END IF;
END LOOP;

CLOSE cdr_cur;
COMMIT;

EXCEPTION
     WHEN OTHERS THEN
          IF cdr_cur%ISOPEN THEN CLOSE cdr_cur; END IF;
     
END;

sexta-feira, 29 de agosto de 2014

MySQL - Backup apenas da estrutura (create table) e procedures/functions

Para efetuar o backup apenas da estutura das tabelas e procedures/functions - ou gerar na verdade um script de criação da estrutura - pode-se usar o utilitário MYSQLDUMP (que faz parte da própria instalação padrão do MySQL) com os seguintes parâmetros:

--no-data -> Indica que deve ser feita apenas o script de criação das tabelas - sem os inserts
--routine -> Indica que as procedures/fucntions deve ser exportadas

Sintaxe:
mysqldump.exe -u<usuario> -p<password> --no-data --routines --databases <banco> --quick --result-file=<arquivo>

onde:
<usuario> - usuário com permissão de acesso ao banco
<password> - senha do usuário
<banco> - banco que será exportado
<arquivo> - caminho e nome do arquivo onde os dados deverão ser exportados

Exemplo:
mysqldump.exe -uroot -p --no-data --routines --databases mysql --quick --result-file=c:\ESTRUTURA_MYSQL.sql

No exemplo acima, a senha será solicitada pelo utilitário no momento da execução


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

Perl - Eliminar Carriage Return e o Line Feed de arquivos

Existem situações em que devemos eliminar um Carriage Return (CR ou \r ou 0A) e um Line Feed (LF ou \n ou 0D) de um arquivo.

Um exemplo fazendo isto em Perl:

#!/usr/bin/perl -w
while (my $linha = <>) {
if ($linha =~ /[0-9]\x0D\x0A/) {
chop $linha; 
chop $linha

print $linha;
}; 
exit;

No exemplo acima, o Carriage Return e o Line Feed somente são excluídos quando forem precedidos por um número.

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

terça-feira, 11 de março de 2014

FTP Server - Mac OS

Para habilitar conexões FTP a uma máquina com MAC OS, usar o seguinte comando:

sudo -s launchctl load -w /System/Library/LaunchDaemons/ftp.plist

Para desabilitar, usar o comando:

sudo -s launchctl unload -w /System/Library/LaunchDaemons/ftp.plist

(dica original de http://hints.macworld.com/article.php?story=20110725142848292)

quarta-feira, 29 de janeiro de 2014

Oracle - Alteração de TableSpace

Para alterar o TableSpace de uma tabela:

ALTER TABLE NomeDaTabela MOVE TABLESPACE NomeNovoTablespace;  

Após a movimentação o(s) índice(s) deve(m) ser re-criado(s):

ALTER INDEX IndexName REBUILD COMPUTE STATISTICS; 

Para alterar o TableSpace de um Índice:

ALTER INDEX NomeDaTabela REBUILD TABLESPACE NomeNovoTablespace;  

Para gerar um script de alteração, pode-se usar:

SELECT 'ALTER TABLE NomeDoEsquema.' || table_name ||   
       ' MOVE TABLESPACE NomeNovoTablespace;'  
FROM dba_tables  
WHERE owner = 'NomeDoEsquema';  
   
SELECT 'ALTER INDEX NomeDoEsquema.' || index_name ||   
       ' REBUILD TABLESPACE NomeNovoTablespace;'  
FROM dba_indexes  
WHERE owner = 'NomeDoEsquema'   
AND index_type != 'LOB';

Dica obtida em: http://www.pierin.com/Publicacoes-13-banco_de_dados-.html

quinta-feira, 16 de janeiro de 2014

LibreOffice - File Archive

Para aqueles que procuram uma versão diferente da atual para o pacote de escritório LibreOffice, segue o link para o site de archive:

http://downloadarchive.documentfoundation.org/libreoffice/old/

Fonte: LibreOffice

quinta-feira, 2 de janeiro de 2014

PL/SQL - Diferença entre Datetime, em Segundos

Para obter a diferença, em segundos, entre duas datas (datetime), deve-se, após fazer a subtração (diferença) entre elas,  efetuar a devida conversão, conforme a fórmula:

round(abs(diferença) * 24 * 60 * 60)

onde diferença: data1 - data2

Exemplo:

round(abs(data_final - data_inicial) * 24 * 60 * 60) as dif_seg