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

terça-feira, 20 de agosto de 2024

Ping - Range de IPS

DOS

Sintaxe:

FOR /L %i IN (inicio,1,termino) DO ping -n 1 base.do.ip.%i | FIND /i "Resposta"

Exemplo:

FOR /L %i IN (10,1,27) DO ping -n 1 172.168.20.%i | FIND /i "Resposta"

Ubuntu

Sintaxe:

ip=base.do.ip;for range in $(seq inicio fim); do echo $ip.$range ; ping -c <qtd> -W <seg>  $ip.$range | grep -Ei 'Reply|Request|Received' ; done

Exemplo:

ip=172.168.20;for range in $(seq 10 27); do echo $ip.$range ; ping -c 5 -W 2  $ip.$range | grep -Ei 'Reply|Request|Received' ; done


terça-feira, 20 de dezembro de 2022

Linux / Bash - Copiar apenas a Estrutura de Diretórios

No Linux/bash para copiar uma estrtura de diretório, pode-se usar o comando abaixo. Para tanto, deve-se estar no diretório de origem:

find -type d -links 2 -exec mkdir -p "/path/to/backup/{}" \;


Dica orginal de: http://devblog.drall.com.br/como-copiar-somente-uma-estrutura-de-diretorios-sem-os-arquivos-no-linux

quarta-feira, 7 de outubro de 2020

MySQL - Saída de SELECT direto em Arquivo Delimitado

 Utilizar o mysql junto com o sed.

Sintaxe com Nome das Colunas:

mysql -A -u[user] -p[senha] [banco] -e "[mysql statement];" | sed 's/\t/;/g' > [arquivo.csv]

Sintaxe sem Nome das Colunas:

mysql -AN -u[user] -p[senha] [banco] -e "[mysql statement];" | sed 's/\t/;/g' > [arquivo.csv]

Exemplo 1 - Converte o separador de <tab> para ponto-e-vírgula:

mysql -A -ueu -psenha banco -e "CALL PR_SELECIONA('202009');" | sed 's/\t/;/g' > relatorio_mes_20200930.csv &

Exemplo 2 - Sem nome das colunas e converte o separador de <tab> para ponto-e-vírgula:

mysql -NA -ueu -psenha banco -e "CALL PR_SELECIONA('202009');" | sed 's/\t/;/g' > relatorio_mes_20200930.csv &

Exemplo 3 - Converte o separador de <tab> para ponto-e-vírgula, e coloca um delimitador de campo alfanumérico

mysql -A -ueu -psenha banco -e "select t1.nu_cpfcnpj, CONCAT('<#>', t1.nm_razao_social,'<#>') razao_social, t2.nu_asset_id, t2.nu_conta_faturamento from tb_crm_customer t1 inner join tb_crm_account t2 on t2.id_customer = t1.id_customer where isnull(t2.dt_desativacao);" | sed 's/\t/;/g' | sed s/"<#>"/\"/g

terça-feira, 14 de julho de 2020

GREP

Para procurar uma lista de palavras via GREP, utiliza-se o parâmetro -f, como abaixo:

grep -f lista.txt arquivos_201*

sexta-feira, 17 de agosto de 2018

Bash - Exemplos de Pesquisa de Arquivos - FIND

Para listarmos os arquivos que foram alterados há menos de NN dias, podemos usar o find, conforme abaixo:

find . -type f -ctime -NNN -name '*'  -printf "%p %C+\n"

onde:
-NNN dias (por exemplo - 30 dias, alterados há 30 dias ou menos)
+NNN dias (por exemplo - 30 dias, alterados há 30 dias ou mais)

Exemplo:
find . -type f -ctime -150 -name '*.aspx.cs'  -printf "%p %C+\n"

listar arquivos com extensão *.aspx.cs alterados há 150 dias ou menos

Para listarmos os arquivos que foram alterados desde o dia XX, que atendam uma determinada nomenclatura (exceto uma em particular), podemos usar o find, conforme abaixo:

find . -type f -newermt "DATA" -name "*" -a ! -name "*" -print

onde:
Data é a data (por exemplo Feb 7)

Exemplo:
find . -type f -newermt "Feb 7" -name "GMUD2018*_CONFERENCIA_PROCEDURE*.sql" -a ! -name "GMUD201800000025*" -print


listar todos os arquivos "GMUD2018*_CONFERENCIA_PROCEDURE*.sql", exceto "GMUD201800000025*" alterados desde 7 Fev

segunda-feira, 31 de agosto de 2015

Sort - Arquivo Posicional

Para classificar um arquivo posicional fixo, quando a(s) chave(s) não está(ão) no começo do arquivo, deve-se usar o parâmetro -k, como a seguir:

-k1.[pos_inicial],1.[pos_final]

Exemplo:

sort -k1.58,1.77 -k1.13,1.26 -k1.175,1.176 -k1.79,1.98

No exemplo acima, o arquivo é classificado pelas posições 58 a 77, em seguida pelas posições 13 a 26, depois pelas posições 175 a 176 e por fim pelas posições 79 a 98.

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


segunda-feira, 22 de julho de 2013

Linux - Tratamento de Exit Status / Return Code

O bash guarda a informação a respeito da execução de um programa na variável de ambiente $? logo após a execução da mesma. Avaliando o conteúdo da mesma é possível verificar se uma determinada execução terminou com sucesso ou não.

Exemplo:

somecommand  argument1 argument2
RETVAL=$?
[ $RETVAL -eq 0 ] && echo Success
[ $RETVAL -ne 0 ] && echo Failure

Linux - Listar Arquivos de um Diretório

Alguns exemplos para listar nomes de arquivos, com e sem path

$ ls workspace/*.c
workspace/teste_ponteiro_array.c  workspace/teste_ponteiro.c
$ ls -1 workspace/*.c
workspace/teste_ponteiro_array.c
workspace/teste_ponteiro.c
$ find workspace/*.c -type f -printf '%f\n'
teste_ponteiro_array.c
teste_ponteiro.c

quarta-feira, 26 de junho de 2013

Validar Quantidade de Campos(Colunas) em Arquivo Delimitado

Script AWK para verificar se um determinado arquivo possui a quantidade de colunas esperada

cat <arquivo> | awk 'BEGIN{FS="<separador>"};NF!=<nro_colunas> {print NF , $0}' 

onde:
<arquivo> - Arquivo que deverá ser validado
<separador> - Separador (delimitador) de campos (colunas) do <arquivo>
<nro_colunas> - Número de campos (colunas) esperado no arquivo

Exemplo;

cat teste.csv |  awk 'BEGIN{FS=";"};NF!=10 {print "linha", NR, "colunas", NF , $0}' 

No exemplo acima, será (ão) direcionadas a saída padrão (tela)  a(s) linha(s) que não tiver(em) 10 colunas, informando a quantidade de colunas encontrada.

Para arquivos posicionais (sem delimitadores), a sintaxe fica:

cat <arquivo> | awk 'BEGIN{FS=""};NF!=<tam_reg> {print NF , $0}' 

onde:
<arquivo> - Arquivo que deverá ser validado
<tam_reg> - Tamanho da Linha

terça-feira, 25 de junho de 2013

Executar Processos em Paralelo com termino Sincrono

Situação 1
Para executar vários processos em paralelo e ao final de todos executar um processo final, pode-se utilizar a instrução bash wait

Sintaxe
wait

Exemplo:
#!/bin/sh
./pgm1 &
echo "Pgm1 em execucao"
./pgm2 &
echo "Pgm2 em execucao"
wait
echo "Termino de ambos os processos"



Situação 2
Executar em paralelo vários processos, com base em um diretório de entrada e ao final de todos os processos, executar um novo processo. Para esta situação, pode-se recorrer a utilização de um pequeno script awk, além de um artifício de criar um arquivo ao final de todos os processos com a instrução bash wait.

Exemplo de script:

#!/bin/sh
DIR_ENTRADA=${1}
rm -fr "processo.ok"
ARQ_LOG_PROGRAMA="${PWD}/script.log"
DATA_EXEC=$(date "+%x-%X")
echo " " > ${ARQ_LOG_PROGRAMA}
echo "1) ${DATA_EXEC} -> Inicio da execucao" >> ${ARQ_LOG_PROGRAMA}

ls ${DIR_ENTRADA} | awk -v e=${DIR_ENTRADA} -v l=${ARQ_LOG_PROGRAMA} '{print ".programa " e "/" $0 ".txt >> " l " & "} END { print "wait;echo ok > processo.ok"}' | bash

while [ ! -f "processo.ok" ]; do
echo "Processando..." >> ${ARQ_LOG_PROGRAMA}
sleep 10
done

DATA_EXEC=$(date "+%x-%X")
echo "2) ${DATA_EXEC} -> Processamento em paralelo encerrado. Início do processo consolidador." >> ${ARQ_LOG_PROGRAMA}
./consolidador.sh

DATA_EXEC=$(date "+%x-%X")
echo "3) ${DATA_EXEC} -> Termino do Processamento" >> ${ARQ_LOG_PROGRAMA}

Agradecimentos a: Jorge Amorim e Leonardo Rombesso !

quinta-feira, 26 de julho de 2012

Executar um comando periodicamente

Para executar um comando a cada tempo, pode-se usar o comando watch do linux:

Sintaxe

watch -n <segundos> '<comando>'

onde:
<segundos> intervalo de tempo (em segundos) - Default 2 segundos
<comando> comando a ser executado

Exemplo

watch 'ls -lhtr' -> Lista o diretório a cada 2 segundos


quinta-feira, 22 de março de 2012

Linux - MySQL e AWK facilitam sua vida

Podemos usar comandos bash (script), awk e mysql juntos para de modo a facilitar o dia-a-dia do usuário.
Comandos bash, mysql e awk podem ser concatenados através de pipe '|'. Abaixo alguns exemplos:

- Efetuar o 'dump' de algumas tabelas de um banco de dados:
echo "show tables like 'abobrinha%'" | mysqlrk -qs | awk '{print $1}' | mysqldump <db> -u <user> -p > <arquivo_dump>.sql

1) Cria um 'comando-mysql' usando o comando echo (bash), que irá gerar uma lista de todas as tabelas iniciadas por abobrinha
echo "show tables like 'abobrinha%'" | mysqlrk -qs | awk '{print $1}' | mysqldump <db> -u <user> -p > <arquivo_dump>.sql


2) O alias mysqlrk chama o mysql usando o comando gerado pelo bash:
echo "show tables like 'abobrinha%'" | mysqlrk -qs | awk '{print $1}' | mysqldump <db> -u <user> -p > <arquivo_dump>.sql


3) O resultado do mysql (relação de tabelas) é passado para o awk, que apenas imprime linha a linha (na verdade, este comando não se faz necessário, mas eu o coloquei como uma forma ilustrativa do que pode ser feito:
echo "show tables like 'abobrinha%'" | mysqlrk -qs | awk '{print $1}' | mysqldump <db> -u <user> -p > <arquivo_dump>.sql


4) A saída do awk é então enviada ao comando mysqldump que gera um dump das tabelas informadas, direcionando estas informações para o arquivo indicado:
echo "show tables like 'abobrinha%'" | mysqlrk -qs | awk '{print $1}' | mysqldump <db> -u <user> -p > <arquivo_dump>.sql



- Excluir tabelas de um banco de dados:

echo "show tables like 'abobrinha%old'" | mysqlrk -qs | awk '{print "drop table " $1 ";"}' | mysqlrk -q --verbose --verbose > mysql.log


1) Cria um 'comando-mysql' usando o comando echo (bash), que irá gerar uma lista de todas as tabelas iniciadas por abobrinha e terminada por old
echo "show tables like 'abobrinha%old'" | mysqlrk -qs | awk '{print "drop table " $1 ";"}' | mysqlrk -q --verbose --verbose > mysql.log

2) O alias mysqlrk chama o mysql usando o comando gerado pelo bash:

echo "show tables like 'abobrinha%old'" | mysqlrk -qs | awk '{print "drop table " $1 ";"}' | mysqlrk -q --verbose --verbose > mysql.log



3) O resultado do mysql (relação de tabelas) é passado para o awk, que concatena a cada nome de tabela a instrução de exclusão da tabela (drop table):

echo "show tables like 'abobrinha%old'" | mysqlrk -qs | awk '{print "drop table " $1 ";"}'mysqlrk -q --verbose --verbose > mysql.log



4) A saída do awk é então enviada ao alias mysqldrk que executa as instruções recebidas, e grava o log no arquivo de log

echo "show tables like 'abobrinha%old'" | mysqlrk -qs | awk '{print "drop table " $1 ";"}' | mysqlrk -q --verbose --verbose > mysql.log