http://www.zago.eti.br/script/loop.txt Scripts, comandos e FAQ relacionados a loop em scripts. Use CTRL+F para refinar a pesquisa. Linha de: **************** separa mensagens ou tópicos. ******************************************************** Zago http://www.zago.eti.br/menu.html FAQ e artigos sobre Linux Página principal sobre script em geral (FAQ), tem mais indicações sobre loop http://www.zago.eti.br/script/A-menu-scripts.html ******************************************************** ******************************************************** watch watch executa um programa repetidamente com a periodicidade informada. Pra sair do loop do "watch" pressione CTRL+C Veja mais sobre ele no man: man watch Veja também sobre logwatchm que é uma ferramenta excelente pra analize de logs, download e documentação no site: http://www.logwatch.org/ http://www2.logwatch.org:81/ Alguns exemplos de uso: mostra o que o usuario linux está fazendo watch "ps aux | grep nome_do_usuario", exemplo pra monitorar o usuário zago. watch "ps aux | grep zago" O tempo default é 2 segundos, pra alterar o tempo, informa em -n , ex. pra executar netstat a cada 1 segundo: watch -n 1 netstat -a A cada 5 segundos: watch -n 5 netstat -a #smbstatus mostra as conexões ativas e alguns dados dos usuarios. #smbstatus -u usuário mostra o que um determinado usuário esta utilizando no samba. Pra executar o comando smbstatus periodicamente, pode usar um script, no exemplo abaixo, o script limpa a tela e executa o comando a cada 3 segundos, ajuste a seu modo o scrip abaixo. [root@faqcl10 root]# cat smbz #!/bin/sh while true; do clear smbstatus -S sleep 3 done Ou simplesmente: watch -n 3 smbstatus -S Veja também os resultados de: watch -d 'smbstatus | grep usuario' watch -d 'smbstatus | grep zago' Caso queira salvar o resultado em arquivo: watch -d 'smbstatus | grep zago' >> logdozago.txt tmpwatch Pra manipular arquivos de acordo com a data, localizar, remover e outros serviços relacionados com a data do arquivo, consulte o man. man tmpwatch ******************************************************** tail O comando tail é execelente pra exibir as entradas nos arquivos de log, pode acompanhar em tempo real o que está sendo registrado nos arquivos de log. Pra sair do loop do "tail" pressione CTRL+C Veja mais sobre ele no man: man tail Veja também na documentação e FAQ especifico sobre o aplicativo, um resumo mais detalhado e indicações sobre o tail em: http://www.zago.eti.br/log.txt Alguns exemplos de linha de comando com tail: - Mostrar as primeiras n linhas de um arquivo # head -n nome do arquivo (default n=10) - Mostrar as últimas n linhas de um arquivo # tail -n nome do arquivo (default n=10) tail -n 1 arquivoquevcquerler isso irá ler a última linha e cair imediatamente para a shel .. Se vc acha importante ficar aguardando sempre a última linha... tail -f -n 1 arquivoquevcquerler tail -f /var/caminho/arquivo.de.log exibe os log no momento que ocorrem, Just-in-time!, também pode copiar este arquivo para analizar em outra maquina, pode editar com vi ou outro editor, pode usar escript ou awk e outras ferramentas para procurar no arquivo de log por expressões ou palavras especificas, Acompanhar as entradas no arquivo de log tail -f /var/log/messages tail -f /var/log/maillog Exibir as ultimas 100 linhas com parada por página tail -100 /var/log/messages | more Monitorando log do Squid: tail -f /var/log/squid/access.log Monitorar por IP, palavra na URL ou outra expressão contida no log. Quando o trafego é grande fica dificil acompanhar o que determinado usuário acessa ou quais usuários estão acessando determinado site, use o grep em combinação com o tail pra filtrar as mensagens de log. filtro por IP de origem. tail -f /var/log/squid/access.log | grep exemplo pra monitorar somente a maquina com IP 192.168.1.53: tail -f /var/log/squid/access.log | grep 192.168.1.53 No resultado aparece somente as mensagens de log da maquina com IP 192.168.1.53 Também pode filtrar por palavras na URL, por exemplo, listar todos que estão acessando sites que contenha na URL a palavra correio: tail -f /var/log/squid/access.log | grep correio Neste exemplo exibe toda a linha de log, pra refinar a pesquisa pra exibir somente o IP e a URL, siga este exemplo. tail -f /var/log/squid/access.log | awk '{print "IP="$3"\t URL="$7}' O resultado fica neste formato: IP=192.168.1.53 URL=http://www.zago.eti.br/log.txt Caso queira exibir outros campos do Log, troque "IP="$3", pela coluna que deseja, altere IP para o nome que deseja exibir e $3 pela coluna que deseja exibir, neste exemplo o IP é a terceira coluna e a URL é a setima, pra exibir IP e tipo de acesso que fica na coluna 4 use: tail -f /var/log/squid/access.log | awk '{print "IP="$3"\t CODIGO="$4}' A linha acima exibe: IP=192.168.1.53 CODIGO=TCP_MISS/200 IP=192.168.1.53 CODIGO=TCP_MISS/200 Siga as dicas acima pra alterar a linha de comando a seu modo. Veja mais sobre grep em: http://www.zago.eti.br/grep.txt Veja mais sobre awk em: http://www.zago.eti.br/awk.txt ******************************************************** a sintaxe do FOR do manual do bash... for ((i=0;i<10;i++)); do cmd done De: waldirio Para: Lista Linux-BR Assunto: (linux-br) Dúvidas com a sintaxe do FOR Data: 29 Nov 2002 22:36:54 -0200 Boa Noite Segue uma dúvida simples .... :), abaixo segue a sintaxe do FOR ################################### for variable in word ... do command done Por exemplo: for i in `cat $LOGS` do mv $i $i.$TODAY done ################################### Como poderia ser feito um FOR simple apenas como o contador interno, o mesmo está feito em C for (i=0;i<10;i++) { printf("Ola\n"); } Atenciosamente ******************************************************** De: Thiago Macieira Para: linux-br@bazar2.conectiva.com.br, mrodrigom@gmail.com Assunto: Re: (linux-br)script para leitura de arquivos Data: Tue, 8 Mar 2005 15:24:27 -0300 Rodrigo Monteiro wrote: >do arquivo orgaos.txt tem um) no arquivo orgaos.txt e >listar a quantidade de usuarios. ex: na linha 1 de >orgaos.txt tem "orgao01", fazer tipo um "orgao01: 130 >usuarios" while read orgao; do echo $orgao: `ls -1 ${orgao}* | wc -l` usuários done < orgaos.txt -- Thiago Macieira - thiago (AT) macieira (DOT) info ******************************************************** De: Anderson Lizardo Responder A: Anderson Lizardo Para: mrodrigom@gmail.com Cc: linux-br@bazar2.conectiva.com.br Assunto: Re: (linux-br)script para leitura de arquivos Data: Tue, 8 Mar 2005 14:06:33 -0400 On Tue, 8 Mar 2005 08:51:24 -0800 (PST), Rodrigo Monteiro wrote: > quero mostrar orgao por orgao a quantidade de usuarios > que existem. quero pegar o nome do orgao (cada linha > do arquivo orgaos.txt tem um) no arquivo orgaos.txt e > listar a quantidade de usuarios. ex: na linha 1 de > orgaos.txt tem "orgao01", fazer tipo um "orgao01: 130 > usuarios" Ola', Teste o seguinte codigo: cd /usr/local/jabber-1.4.2/spool/im.ceara.gov.br/ ls | cut -d. -f1 | uniq -c | awk '{print $2 ": " $1 " usuarios"}' Sim, este e' o script todo :). Se voce usar o codigo acima nao e' necessario criar o arquivo contendo a lista de todos os orgaos. Ate' a proxima, -- Anderson Lizardo ******************************************************** De: Leandro de Rezende Para: Jeffy and1 , Lista de disc. conectiva Assunto: Re: (linux-br)shell Script Data: Mon, 23 May 2005 14:09:02 -0300 Olá Jeff, uma das maneiras de fazer com bash é: #### cat arquivo.txt | while read linha; do # ... seu código aqui # ... p. exemplo echo "$linha" # ... done #### Um abraço, Leandro Jeffy and1 escreveu: > Ola lista, estou com uma dificuldade quanto a encontrar uma forma de > guardar linha por linha de um texto em uma variavel... Nao posso > alterar o arquivo e as linhas contem espacos em branco... o problema > eh aq a variavel armazena somente o primeiro campo da string, apos o > espaco ela corta. > > exemplo: > foreach linha (`cat arquivo`) > > end > > alguem tem alguma solucao para isso? > vlw > jeff ******************************************************** De: Claudio Matsuoka Para: Jorge Godoy Cc: linux-br@bazar2.conectiva.com.br Assunto: Re: (linux-br)shell de comando para reload automatico Data: Thu, 2 Jun 2005 17:37:30 -0300 (BRT) On Thu, 2 Jun 2005, Jorge Godoy wrote: > Djames Suhanko writes: > > > for i in `seq 1 30`;do echo "$i"; sleep 1;done > > Se formos rigorosos com a exigência, isso aqui é falho. Ele certamente tem um > intervalo de 1 segundo entre uma execução e outra, mas não é executado a cada > um segundo. Hmm. while true; do something & sleep 1; done? De: Djames Suhanko Para: Claudio Matsuoka Cc: linux-br@bazar2.conectiva.com.br Assunto: Re: (linux-br)shell de comando para reload automatico Data: Thu, 2 Jun 2005 17:43:56 -0300 Beleza. Você está jogando o processo em segundo plano. Se ele travar por um motivo qualquer os recursos da maquina podem se esgotar, dependendo do que o script faz. Qual a função desse script? Em Qui 02 Jun 2005 17:37, Claudio Matsuoka escreveu: > > > for i in `seq 1 30`;do echo "$i"; sleep 1;done > while true; do something & sleep 1; done? ******************************************************** De: Marcos Pawloski Responder A: Marcos Pawloski Para: webmaster Cc: linux-br@bazar2.conectiva.com.br Assunto: Re: (linux-br)shell de comando para reload automatico Data: Fri, 3 Jun 2005 10:28:08 -0300 Nem precisa de crontab...se é pra ficar rodando o tempo todo, usa um loop básico em shell "power ranger"... while true; do seu_script.sh; sleep 1; echo ""; echo""; echo""; echo "DI NOOOVO"; echo ""; echo ""; done ps. nem precisa dos " echo", puz só pra exemplificar alguma informação que eventualmente queira por na tela...tipo " KEEP OUT DANGEROUS SERVER RUNNING!!" Em 02/06/05, webmaster escreveu: > Ola lista, > > Criei um Shell de comando mas preciso que ele fique se executando de > segundo em segundo, coloquei ele no contab mas ele so executa de minuto > em minuto, alguém lembra qual a linha de comando para que ele fique se > executado de segundo em segundo, ou como posso automatizar isso? -- Marcos R. Pawloski mrpawloski@gmail.com ******************************************************** De: Thiago Macieira Para: linux-br@bazar2.conectiva.com.br, Claison Rezende Amorim Assunto: Re: (linux-br)Shell Script - Linha a Linha Data: Wed, 15 Jun 2005 23:16:51 -0300 Claison Rezende Amorim wrote: >Gostaria de uma ajuda. Estou precisando ler um arquivo txt linha a >linha utilizando shell script. Alguem teria uma solucao ai pra me >ajudar???? while read line; do # Faça alguma coisa aqui echo "$line" done < arquivo-fonte.txt -- Thiago Macieira - thiago (AT) macieira.info - thiago (AT) kde.org PGP/GPG: 0x6EF45358; fingerprint: E067 918B B660 DBD1 105C 966C 33F5 F005 6EF4 5358 5. Swa he géanhwearf tó timbran, and hwonne he cóm, lá! Unix cwæð "Hello, World". ?fre ?ghwilc wæs glæd and seo woruld wæs fréo. ******************************************************** De: Jorge Godoy Para: Claison Rezende Amorim Cc: linux-br@bazar2.conectiva.com.br Assunto: Re: (linux-br)Shell Script - Linha a Linha Data: 15 Jun 2005 22:50:15 -0300 Claison Rezende Amorim writes: > Gostaria de uma ajuda. Estou precisando ler um arquivo txt linha a > linha utilizando shell script. Alguem teria uma solucao ai pra me > ajudar???? Em qual shell? zsh? bash? ksh? csh? Uma solução comum à maioria seria usar algo como um: IFS="\n"; for linha in `cat arquivo` do operação com $linha done -- Jorge Godoy ******************************************************** De: sergio.ps Para: linux-br@bazar2.conectiva.com.br Assunto: Re: (linux-br) Vari?veis no Bash Data: Fri, 7 Jul 2006 14:53:32 -0300 Agradeço a todos os colegas pela dica do vetor. Num próximo script, certamente eu irei considerar essa opção. Acontece que essa alteração é num conjunto de scripts que dependem um do outro, e são muitos lugares onde eu teria que alterar. A dica do colega Hebert, me parece, a que mais se ajusta ao meu problema. for ((i=1; i<6; i++)) { eval echo "O valor var_$i é: \$var_$i"; } Obrigado a todos novamente. Sérgio. ******************************************************** De: Flavio Torres Para: sergio.ps , linux-br Assunto: Re: (linux-br) Vari?veis no Bash Data: Fri, 07 Jul 2006 14:11:36 -0300 sergio.ps escreveu: > Olá novamente a todos os colegas da lista. > > Tenho uma dúvida de programação no shell. > > Vamos supor que num bash script eu tenha a seguinte situação: > > var_1=123 > var_2=456 > var_3=789 > var_4=ABC > var_5=DEF > > Bem eu preciso recuperar o valor de cada uma durante um loop de 1 a 5. > > for((i=1; i<6; i++)); > do > > echo "O valor $i é: $var_? (valor de i)"; > > done; > > Como eu faço isso, para não ter de repetir 5 vezes a mesma coisa. Olá, Parece mas não é :) Ele esta imprimindo o valor da variável $var_ e depois de $i, juntos formam 1,2,3,4... Precisa ser assim: eval echo \$var_$i; Abraços... -- []'s Flavio Torres - Administrador de Sistemas ******************************************************** De: Leandro de Rezende Para: Nelson Ramos Cc: linux-br@bazar2.conectiva.com.br Assunto: Re: (linux-br) Problemas com while no bash Data: Fri, 20 Apr 2007 12:50:25 -0300 olá Nelson, uma maneira melhor de ler sequencialmente as linhas de um arquivo com o while é da seguinte: while read linha do echo $linha ( seu código usando a variável $linha ) done < cadastro.txt note o pipe de entrada (<) seguido pelo nome do arquivo a ser lido no final do comando (done) abraços Leandro Nelson Ramos escreveu: > Bom, estou aprendendo shell script (como alguns já devem ter notado > pelas minhas frequentes perguntas) e estou tendo problemas com o > while. ******************************************************** De: Djames Suhanko Para: linux-br@bazar2.conectiva.com.br Assunto: Re: (linux-br) Problemas com while no bash Data: Fri, 20 Apr 2007 13:08:31 -0300 Opa, agora que ví. Parece que você quer substituir o pipe por uma nova linha, não é? Basta substituir o cut por tr "|" "\n": cat cadastro|while read line; do echo $line|tr "|" "\n" >>teste;done É isso. ******************************************************** De: Thiago Macieira Para: linux-br@bazar2.conectiva.com.br Assunto: Re: (linux-br) Problemas com while no bash Data: Fri, 20 Apr 2007 21:02:23 +0200 (16:02 BRST) Djames Suhanko wrote: >cat cadastro|while read line; do echo $line|tr "|" "\n" >>teste;done Ou, ainda mais curto: tr "|" "\n" cadastro >> teste -- Thiago Macieira - thiago (AT) macieira.info - thiago (AT) kde.org PGP/GPG: 0x6EF45358; fingerprint: E067 918B B660 DBD1 105C 966C 33F5 F005 6EF4 5358 ******************************************************** De: Thiago Macieira Para: linux-br@bazar2.conectiva.com.br Assunto: Re: (linux-br) Problemas com while no bash Data: Fri, 20 Apr 2007 18:57:33 +0200 (13:57 BRST) Nelson Ramos wrote: >cd /home/nelson/scripts/relatorios >rm -f teste >cont="1" >result="1" >while [ "$cont" -gt "0" ] >do > if [ "$result" -ne " " ] > then > result=`cat cadastro | head -$cont | tail -n +$cont | > cut -d"|" -f1` echo $result >> teste > cat cadastro | head -$cont | tail -n +$cont | cut -d"|" > -f2 >> teste cat cadastro | head -$cont | tail -n +$cont | cut -d"|" > -f3 >> teste cat cadastro | head -$cont | tail -n +$cont | cut -d"|" > -f4 >> teste cat cadastro | head -$cont | tail -n +$cont | cut -d"|" > -f5 >> teste cat cadastro | head -$cont | tail -n +$cont | cut -d"|" > -f6 >> teste echo " " >> teste > echo " " >> teste > cont=`expr $cont + 1` > else > cont="0" > fi >done Reescrevendo o script: cd /home/nelson/scripts/relatorios awk -F '|' \ '{print $1; print $2; print $3; print $4; print $5; print $6; print "";}' \ < cadastro > teste -- Thiago Macieira - thiago (AT) macieira.info - thiago (AT) kde.org PGP/GPG: 0x6EF45358; fingerprint: E067 918B B660 DBD1 105C 966C 33F5 F005 6EF4 5358 ******************************************************** De: Djames Suhanko Para: linux-br@bazar2.conectiva.com.br Assunto: Re: (linux-br) Problemas com while no bash Data: Fri, 20 Apr 2007 12:49:58 -0300 Olá! Isso tudo é só pra pegar o primeiro campo de cada linha? cat cadastro|while read line; do echo $line|cut -f1 -d\| >>teste;done Abraços! Em Sexta 20 Abril 2007 02:38, Nelson Ramos escreveu: # Seu arquivo de exemplo -------------------------- 54654564|funcionario1|cargo|contrato|mes|ano 54654465|funcionario2|cargo|contrato|mes|ano 54654791|funcionario3|cargo|contrato|mes|ano #Seu script ----------------------------------------- #!/bin/bash cd /home/nelson/scripts/relatorios rm -f teste cont="1" result="1" while [ "$cont" -gt "0" ] do if [ "$result" -ne " " ] then result=`cat cadastro | head -$cont | tail -n +$cont | cut -d"|" -f1` echo $result >> teste cat cadastro | head -$cont | tail -n +$cont | cut -d"|" -f2 >> teste cat cadastro | head -$cont | tail -n +$cont | cut -d"|" -f3 >> teste cat cadastro | head -$cont | tail -n +$cont | cut -d"|" -f4 >> teste cat cadastro | head -$cont | tail -n +$cont | cut -d"|" -f5 >> teste cat cadastro | head -$cont | tail -n +$cont | cut -d"|" -f6 >> teste echo " " >> teste echo " " >> teste cont=`expr $cont + 1` else cont="0" fi done exit 0 ******************************************************** ******************************************************** ********************************************************