Usar comando "for" encadeado [RESOLVIDO]

1. Usar comando "for" encadeado [RESOLVIDO]

dantemorius
dantemorius

(usa Debian)

Enviado em 28/11/2014 - 05:12h

Bom dia galera,

Gostaria de dicas para usar um comando "for" dentro de outro ou concatenar duas situações. Exemplo: criar um script que use as variáveis d (dia) e m (mês) para pegar um determinado período de logs.

O script que funciona pra mim pra "dia" por exemplo, é o seguinte:

for d in {01..31}; do find /exemplo/data/transport/2014/11/$d -type f | grep smtp-smtpd | while read u; do sudo bzgrep "conta@usuario.com.br" $u; done ;


O que eu quero/preciso fazer, é colocar um "for" a mais pra varrer dia e mês. Tentei usar conforme abaixo, porém não deu certo:

for d in {01..31}; for m in {01..12}; do find /exemplo/data/transport/2014/11/$d -type f | grep smtp-smtpd | while read u; do sudo bzgrep "conta@usuario.com.br" $u; done ;

Já tentei também substituir o segundo for por:
for d in {01..31} and m in {01..12}; do find (...)
for d in {01..31} -a m in {01..12}; do find(...)
for d in {01..31}; m in {01..12}; do find(...)


Em .net, por exemplo, eu faria:

for m=01 to 12
for m=01 to 30
"acao"
done
done

ou algo do tipo.

Alguma ideia de como fazer isso?


  


2. Re: Usar comando "for" encadeado [RESOLVIDO]

M4iir1c10
m4iir1c10

(usa Arch Linux)

Enviado em 28/11/2014 - 06:25h


Gostaria de dicas para usar um comando "for" dentro de outro ou concatenar duas situações. Exemplo: criar um script que use as variáveis d (dia) e m (mês) para pegar um determinado período de logs.

for d in {01..31}; for m in {01..12}; do find /exemplo/data/transport/2014/11/$d -type f | grep smtp-smtpd | while read u; do sudo bzgrep "conta@usuario.com.br" $u; done ;

Alguma ideia de como fazer isso?


Qual e o objectivo final?

Voce quer um dia e um mes especifico? use for e if dentro do for

Voce quer um report que separe os dias e meses baseando-se nos meses

Janeiro 01
Janeiro 02
Janeiro 03...

Voce quer um report que separe os dias e meses baseando-se nos dias

01 Janeiro
01 Fevereiro
01 Marco...
02 Janeiro
02 Fevereiro
02 Marco...

Geralmente baseado no mes e mais usado, assim sendo:

for m in {1..12}
do for d in {1..31}
do acao
done
done

resultado
1 1
1 2
1 3
1 4...

caso voce precise do dia e mes com o 0 antes do numero para numeros menor que 10.

for m in $(seq 01 12)
do for d in $(seq 01 31)
do echo "$(printf %02d $d)/$(printf %02d $m)"
done
done

Caso voce quer o mes antes do dia so troque a ordem de $d e $m na linha
do echo...

Espero ter ajudado.



3. Re: Usar comando "for" encadeado [RESOLVIDO]

Thiago Henrique Hüpner
Thihup

(usa Manjaro Linux)

Enviado em 28/11/2014 - 10:11h

Veja se ajuda:


for((mes=1;mes<=12;mes++));do
for((dia=1;dia<=31;dia++));do
# Faça algo com o dia e o ano
done
done


Espero ter ajudado

[]'s

T+


4. Re: Usar comando "for" encadeado [RESOLVIDO]

dantemorius
dantemorius

(usa Debian)

Enviado em 28/11/2014 - 16:53h

Deu pra dar uma base, mas alguém sabe como eu faria isso usando shell script "in line"? tipo, já digitar o comando na sequência e ele retornar os logs dos dias e meses que eu incluísse no "for"?


5. Re: Usar comando "for" encadeado [RESOLVIDO]

M4iir1c10
m4iir1c10

(usa Arch Linux)

Enviado em 29/11/2014 - 01:00h

Voce quer dizer digitar o comando sem criar um bash script, so usando o terminal uma vez e pronto?

para isso voce so precisa incluir um ; onde estaria uma quebra de linha.


for i in $(seq 1 31)
do echo $i
done


Vai ficar assim


for i in $(seq 1 31);do echo $i;done;





6. Re: Usar comando "for" encadeado [RESOLVIDO]

Thiago Henrique Hüpner
Thihup

(usa Manjaro Linux)

Enviado em 29/11/2014 - 09:48h

Ou pode fazer assim :


#Assim ...

for((mes=1;mes<=12;mes++));do
for((dia=1;dia<=31;dia++));do
# Faça algo com o dia e o ano
done
done

#Fica assim ...

for((mes=1;mes<=12;mes++));do for((dia=1;dia<=31;dia++));do echo $dia;done;done


[]'s

T+


7. Re: Usar comando "for" encadeado [RESOLVIDO]

dantemorius
dantemorius

(usa Debian)

Enviado em 29/11/2014 - 21:59h

m4iir1c10 desse modo eu consigo fazer tranquilo, minha dificuldade está sendo para usar dois comandos "for" um dentro do outro, um pra dia e outro pra mês (para mês de 1=> 12 e para dias de 1=> 31), sem bash, direto inline.

Esse comando vai varrer todos os logs dos meses que eu quiser, contemplando todos os dias, entende? As variaveis ficarão no caminho do comando...

Só que sempre que eu tento usar um for d in {01..31}; do for m {01..12} (sequencia do comando) ele dá erro...


8. Re: Usar comando "for" encadeado [RESOLVIDO]

Thiago Henrique Hüpner
Thihup

(usa Manjaro Linux)

Enviado em 30/11/2014 - 09:00h

Amigo , e essa maneira ?


for((mes=1;mes<=12;mes++));do for((dia=1;dia<=31;dia++));do Faz algo com dia/mes;done;done


Olha "inline" significa "em linha" , ou seja , esse forma é a forma escrita no Bash (no terminal) diretamente.

Se não entendeu essa maneira , publique suas duvidas , mas é bem simples o funcionamento e o melhor Não Precisa chamar comandos externos ! , agora talvez não entenda a diferença , mas te digo que se for aprender a fundo shell script , não utilize comandos externos , eles podem mais te atrapalhar.

Uma breve explicação :


for((i=1;i<=31;i++));do ...

Inicializa a variavel 'i' com o valor de 1

for((i=1;i<=31;i++));do ...

Enquanto essa condição for verdadeira , o loop continua , nesse caso , enquanto for menor ou igual a 31 o loop continuará a executar

for((i=1;i<=31;i++));do ...

Quando terminar os comandos em execução , o 'i' será incrementado em 1 (e terá o valor de 2), na segunda execução , incrementará em 1 , e assim sucessivamente


Espero ter ajudado

[]'s

T+


9. Re: Usar comando "for" encadeado [RESOLVIDO]

M4iir1c10
m4iir1c10

(usa Arch Linux)

Enviado em 30/11/2014 - 19:27h


for i in {1..12};do for x in {1..31};do echo $(printf %02d $i)/$(printf %02d $x);done;done;


Mais doque isso, me desculpe mais voce quer tirar de nos a resposta exata do seu problema, oque pode te ajudar agora, porem voce nao vai aprender e quando prescisar no futuro vai vir aqui denovo...

Observe que diferente de javascript e outras linguagens o for do bash usa a sintese

for $var in (condicao); do rotina; done
ou

for (($var=valor; $var condicao;$var rotina));do rotina 2;done

Cadeada

Depois do primeiro ;do vem o for com a segunda condicao e depois do segundo ;do a rotina e fechando os dois for ;done;done

A mesma coisa se aplica para o for com parenteses e codicao.


10. Re: Usar comando "for" encadeado [RESOLVIDO]

M4iir1c10
m4iir1c10

(usa Arch Linux)

Enviado em 06/12/2014 - 07:17h

Se resolveu marque como resolvido, caso ainda ha duvidas pode perguntar, quando eu disse

Mais doque isso, me desculpe mais voce quer tirar de nos a resposta exata do seu problema...


Eu nao quiz dizer

Para de fazer perguntar, Po!


Se alguma coisa ainda nao esta funcionando, diz qual e a mensagem de erro, isso ajuda bastante.



11. Re: Usar comando "for" encadeado [RESOLVIDO]

dantemorius
dantemorius

(usa Debian)

Enviado em 06/12/2014 - 13:18h

Obrigado, já ajudou bastante.


12. Re: Usar comando "for" encadeado [RESOLVIDO]

Thiago Henrique Hüpner
Thihup

(usa Manjaro Linux)

Enviado em 06/12/2014 - 13:25h

Bom , quem ajudou , eu ou 'ele' ?

[]'s

T+



01 02



Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts