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);
}
quinta-feira, 27 de novembro de 2014
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.
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;
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
--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).
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> &
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
<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.
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
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)
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
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
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
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
Assinar:
Comentários (Atom)