Varrer arquivo linha por linha [RESOLVIDO]

1. Varrer arquivo linha por linha [RESOLVIDO]

Newton Teixeira
newtonJr.

(usa CentOS)

Enviado em 01/07/2009 - 08:47h

Olá comunidade, peço ajuda para criar um script que faz testes em máquinas via telnet.

Tenho o seguinte arquivo texto no seguinte formato:

#SIGLA-SUBEST IP1 IP2 LOGIN SENHA NOME-BASE
LI 192.168.43.14 192.168.43.14 sage sage semi
LD 192.168.44.11 192.168.44.12 sage sage eln_sl2
PR 192.168.51.11 192.168.51.12 sage sage peritoro
PD 192.168.49.11 192.168.49.12 sage sagesage pdd
IZ 192.168.174.11 192.168.174.12 sage sage ipz
CH 192.168.54.11 192.168.54.12 sage sage cneto

Preciso fazer uma varredura nesse arquivo linha por linha e para cada linha
colocar cada "campo" em uma variavel. Eis um pseudo-codigo:

While (arquivo !+ EOF) {
subestacao = arquivo.linha_atual.campo1
ip1 = arquivo.linha_atual.campo2
ip2 = arquivo.linha_atual.campo
login = arquivo.linha_atual.campo3
senha = arquivo.linha_atual.campo4
base = arquivo.linha_atual.campo5

}

Eu fiz esse programa em VB.NET mas agora preciso fazer via sheel script.
Como faço isso em shell script? Começei a estudar mas preciso fazer isso rapido.
Agradeço desde já e fico no aguardo on-line.






  


2. Re: Varrer arquivo linha por linha [RESOLVIDO]

nelio
neliobjr

(usa Red Hat)

Enviado em 01/07/2009 - 10:10h

Newton, este script te ajudará, se for o caso adicione um contador para que os nomes fiquem diferentes, assim:

subestacao = arquivo.linha_atual.campo1
ip1 = arquivo.linha_atual.campo2
ip2 = arquivo.linha_atual.campo
login = arquivo.linha_atual.campo3
senha = arquivo.linha_atual.campo4
base = arquivo.linha_atual.campo5


subestacao2 = arquivo.linha_atual.campo1
ip12 = arquivo.linha_atual.campo2
ip22 = arquivo.linha_atual.campo
login2 = arquivo.linha_atual.campo3
senha2 = arquivo.linha_atual.campo4
base2 = arquivo.linha_atual.campo5

segue script:

#!/bin/sh

cat /home/backup/teste | while read linha; do #mude o caminho do cat para o caminho do seu arquivo
echo $linha | awk {'print subestacao $1'}
echo $linha | awk {'print ip1 $2'}
echo $linha | awk {'print ip2 $3'}
echo $linha | awk {'print login $4'}
echo $linha | awk {'print senha $5'}
echo $linha | awk {'print base $6'}
echo proxima linha
echo " "
done

# da para fazer umas mudanças deixar mais enxuto, mas acredito que assim resolva e é o mais pratico.

ABS





3. Re: Varrer arquivo linha por linha [RESOLVIDO]

Newton Teixeira
newtonJr.

(usa CentOS)

Enviado em 01/07/2009 - 10:56h


Olá nelio, em primeiro lugar muito obrigado pela atenção e ajuda.

Tenho a seguinte dúvida:
Como faço para atribuir o resultado do awk para uma variavel especifica?
Vou precisar dessas variaveis para fazer comandos via telnet em cada uma dessas máquinas.

Eis um exemplo em pseudo-codigo:

VARIAVEL_IP = $linha | awk {'print ip $1'}
VARIAVEL_LOGIN = $linha | awk {'print login $4'}
VARIAVEL_SENHA = $linha | awk {'print senha $5'}


echo $linha | awk {'print subestacao $1'}
echo $linha | awk {'print ip1 $2'}
echo $linha | awk {'print ip2 $3'}
echo $linha | awk {'print login $4'}
echo $linha | awk {'print senha $5'}
echo $linha | awk {'print base $6'}



(
sleep 5
echo VARIAVEL_LOGIN;
sleep 2;
echo VARIAVEL_SENHA;
sleep 2;
echo "ls -lh";
sleep 2;
echo "ps aux | grep alr";
sleep 2;
echo "ps aux | grep alr | >> result-teste-scada-primario.txt"
echo "quit";
) | telnet VARIAVEL_IP | >> result-telnet.txt


DEsde já agradeço e fico no aguardo on-line.


4. Re: Varrer arquivo linha por linha [RESOLVIDO]

nelio
neliobjr

(usa Red Hat)

Enviado em 01/07/2009 - 11:21h

Estive lendo melhor e acho q te respondi errado, nao tinha reparado que queria jogar em variaveis, fica assim entao:

cat /home/backup/teste | while read linha; do #mude o caminho do cat para o caminho do seu arquivo

Subestacao=`echo $linha | awk {'print $1'}`
ip1=`echo $linha | awk {'print $2'}`
ip2=`echo $linha | awk {'print $3'}`
login=`echo $linha | awk {'print $4'}`
senha=`echo $linha | awk {'print $5'}`
base=`echo $linha | awk {'print $6'}`
echo $Subestacao
echo $ip1
echo $login
echo $senha
echo $base
sleep 1 #seus comandos
done



5. Re: Varrer arquivo linha por linha [RESOLVIDO]

Newton Teixeira
newtonJr.

(usa CentOS)

Enviado em 01/07/2009 - 12:11h

Nelio, funcionou na lata. Gostaria, se possivel, que você continuasse a me orientar em outras operações nesse script. Depois, se quiser, podemos publicar no site para ajudar outras pessoas.

Preciso fazer as seguintes tarefas para cada linha desse arquivo: um ftp (operação put) e
a execução de um comando via telnet (com esse arquivo como parametro) na maquina remota.

Eis a cara o script até agora:

#!/bin/bash

# PARA CADA SUBESTAÇÃO EXECUTAR OS COMANDOS VIA TELNET
cat /export/home/sage/TAGO/INFO/INFO-SUBEST.txt | while read linha; do
subestacao=`echo $linha | awk {'print $1'}`
ip1=`echo $linha | awk {'print $2'}`
ip2=`echo $linha | awk {'print $3'}`
login=`echo $linha | awk {'print $4'}`
senha=`echo $linha | awk {'print $5'}`
base=`echo $linha | awk {'print $6'}`
echo $subestacao
echo $ip1
echo $login
echo $senha
echo $base

ftp -in
passive
open $subestacao
user $login $senha
bin
bye
EOF

done

Porém na hora de executar o script com ftp, aparece o seguinte erro:

sage@srv-sl-03:~/TAGO > ./script-vivaolinux.sh
LI
192.168.43.14
sage
sage
semi
?Invalid command
?Invalid command
?Invalid command
?Invalid command
?Invalid command
./script-vivaolinux.sh: line 30: passive: command not found
./script-vivaolinux.sh: line 32: user: command not found
./script-vivaolinux.sh: line 33: bin: command not found
INFO parametros.sh script-telnet-teste.sh substring.sh
juntatudo.sh relacao.sh script-vivaolinux.sh users.sh
musica-super-mario.sh result-telnet.txt shells.sh zerado.sh
./script-vivaolinux.sh: line 35: bye: command not found
./script-vivaolinux.sh: line 36: EOF: command not found


Nesse ftp, tenho que enviar um arquivo para a subestação.
Esse arquivo tem o nome no seguinte formato:

SIM_[subestacao].txt. Ex: SIM_IZ.txt, SIM_PD.txt, SIM_LD.txt, etc.

A parte do ftp teria que ter essa cara:
ftp -in
passive
open $subestacao
user $login $senha
bin
----------------
PUT "SIM_" & subestacao & ".txt" ---- Como concatenar em shell ?
----------------
bye
EOF

A outra tarefa é realizar duas operações via telnet (para cada máquina) e obter o resultado dessas operações.

A primeira tarefa é obter o resultado do comando date tanto da maquina local (a que roda o script)
quanto da maquina remota ($ip1 ou $ip2) e adicionar cada resultado em um arquivo.

Eis como era o código que tinha feito em vb.net:

Telnet1.Send("telnet " + config.IPSCADA_CORPRIMARIO + " -l " + login_cor + vbCrLf)
' s = Telnet1.WaitFor("Password")
' Debug.WriteLine(s.ToString)
' Telnet1.Send(senha_cor + vbCrLf)
' s = Telnet1.WaitFor(PROMPT)
' Debug.WriteLine(s)

' Telnet1.Send("date" + vbCrLf)
' s = Telnet1.WaitFor(PROMPT)
' Debug.WriteLine(s)

' s = s.Remove(0, 5)
' s = s.Split("@")(0).Remove(31, 5).Trim
' Debug.WriteLine(s)
' date_cor = ("SCD" + "; " + s + ";")

Depois que a varredura no arquivo tivesse sido completada, o resultado seria um
arquivo (SUBEST_DATES_jun0309.txt) com os seguintes dados, onde SCD é a máquina local:

SCD; Qua Jun 3 09:22:33 BRT 2009; LI; Qua Jun 3 09:42:54 BRT 2009;
SCD; Qua Jun 3 09:22:39 BRT 2009; LD; Qua Jun 3 09:21:04 GMT 2009;
SCD; Qua Jun 3 09:22:47 BRT 2009; PR; Qua Jun 3 09:22:49 WET 2009;
SCD; Qua Jun 3 09:22:57 BRT 2009; PD; Qua Jun 3 09:22:58 BRT 2009;
SCD; Qua Jun 3 09:23:05 BRT 2009; IZ; Qua Jun 3 09:23:07 BRT 2009;
SCD; Qua Jun 3 09:23:20 BRT 2009; CH; Qua Jun 3 09:23:22 BRT 2009;

Dei uma pesquisada na net, e montei o seguinte código em shell:

(
sleep 5
echo "sage";
sleep 2;
echo "sagesage";
sleep 2;
echo "ls -lh";
sleep 2;
echo "ps aux | grep alr";
sleep 2;
echo "quit";
) | telnet 192.168.43.11

A outra questão é que preciso obter o resultado do comando "ps aux | grep alr" e verificar
se esse resultado tem ou não a presença de um certo padrão. Ex:

sage@srv-sl-01:~/sage > ps aux | grep alr
sage 10267 0.0 0.0 3884 608 pts/4 S+ 12:04 0:00 grep alr
sage 19139 0.0 0.9 45288 9848 pts/3 S Jun20 3:39 /export/home/sage/sage/bin/Linux_x86/ems/alr tr
sage 19141 0.0 0.1 26612 1168 pts/3 S Jun20 0:10 /export/home/sage/sage/bin/Linux_x86/ems/alr tr
sage 19159 0.0 0.0 16516 460 pts/3 S Jun20 0:00 /export/home/sage/sage/bin/Linux_x86/ems/alr tr

E eu fizer o comando "ps aux | grep alr" na maquina remota e o resultado acima aparecer, então vou utilizar o ip1 para me comunicar com as subestações, caso contrário, vou me comunicar através do ip2.

Em vb.net, eu fazia da seguinte forma:

Seg = Telnet1.Send("psax | grep alr" + vbCrLf)
' s = Telnet1.WaitFor(PROMPT)
' Debug.WriteLine(s)

' If s.Contains("alr tr") Then
' flag = True
' Else
' flag = False
' End If

Como fazer essa operação com telnet em shell script?

Nelio, não quero abusar da sua boa vontade, uma vez que você já me ajudou muito.
O problema é que tenho que entregar esse script antes de entrar de férias. Além disso, creio que ele pode
ajudar outras pessoas, haja vista que o mesmo realiza várias tarefas. Fico no aguardo on-line,. Att.





6. Re: Varrer arquivo linha por linha [RESOLVIDO]

nelio
neliobjr

(usa Red Hat)

Enviado em 01/07/2009 - 15:27h

Cara eu não tenho grande conhecimento com ftp e telnet, conheço o Linux devido ao Oracle, porem posso tentar te ajudar, responda o post com seu email, q a gente corre atras e finaliza isto, não tenho msn, pois é bloqueado no meu serviço, ai eu respondo no seu email, se quiser.




7. Re: Varrer arquivo linha por linha [RESOLVIDO]

Newton Teixeira
newtonJr.

(usa CentOS)

Enviado em 01/07/2009 - 15:34h

Oi nelio, eu consegui evoluir até aqui:


#!/bin/bash

# PARA CADA SUBESTAÇÃO EXECUTAR OS COMANDOS VIA TELNET
cat /export/home/sage/TAGO/INFO/INFO-SUBEST.txt | while read linha; do

subestacao=`echo $linha | awk {'print $1'}`
ip1=`echo $linha | awk {'print $2'}`
ip2=`echo $linha | awk {'print $3'}`
login=`echo $linha | awk {'print $4'}`
senha=`echo $linha | awk {'print $5'}`
base=`echo $linha | awk {'print $6'}`
echo -n "$subestacao "
echo -n "$ip1 "
echo -n "$login "
echo -n "$senha "
echo -n "$base "
echo

#TESTAR SE IP1 E PRIMARIO
(
sleep 10
echo $login;
sleep 5;
echo $senha;
sleep 5;
echo "date";
sleep 4;
echo "ps aux | grep alr";
sleep 4;
echo "quit";
) | telnet $ip1

path_subest="/export/home/sage/sage/config/" && $base && "/simul/"
arquivo_simtr="SIM_" && subest && ".txt"

ftp -ivn <<FIM
open $ip1
user $login $senha
binary
lcd INFO
cd $path_subest
pwd
put $arquivo_simtr
bye
FIM

done



Falta ainda concatenar as string da forma correta (path_subest="/export/home/sage/sage/config/" && $base && "/simul/" arquivo_simtr="SIM_" && subest && ".txt") e testar o resultado do telnet, o qual não sei a melhor forma de fazer.

O meu e-mail é newton.junior@eletronorte.gov.br e newton.teixeira@yahoo.com.br. Agradeço pelo apoio. Att.


8. Re: Varrer arquivo linha por linha [RESOLVIDO]

Newton Teixeira
newtonJr.

(usa CentOS)

Enviado em 01/07/2009 - 15:46h

Nelio, evolui mais um pouco. Falta agora testar o resultado do telnet.

SE resultado do telnet CONTÊM um certo padrão ENTAO
IP = ip1
ELSE
IP = ip2
FIM SE

#!/bin/bash

# PARA CADA SUBESTAÇÃO EXECUTAR OS COMANDOS VIA TELNET
cat /export/home/sage/TAGO/INFO/INFO-SUBEST.txt | while read linha; do

subestacao=`echo $linha | awk {'print $1'}`
ip1=`echo $linha | awk {'print $2'}`
ip2=`echo $linha | awk {'print $3'}`
login=`echo $linha | awk {'print $4'}`
senha=`echo $linha | awk {'print $5'}`
base=`echo $linha | awk {'print $6'}`
echo -n "$subestacao "
echo -n "$ip1 "
echo -n "$login "
echo -n "$senha "
echo -n "$base "
echo

#TESTAR SE IP1 E PRIMARIO
#(
#sleep 10
#echo $login;
#sleep 5;
#echo $senha;
#sleep 5;
#echo "date";
#sleep 4;
#echo "ps aux | grep alr";
#sleep 4;
#echo "quit";
#) | telnet $ip1

path_subest="/export/home/sage/sage/config/$base/simul/"
arquivo_simtr="SIM_$subestacao.txt"

echo "path_subest - $path_subest"
echo
echo "arquivo_simtr - $arquivo_simtr"
echo

ftp -ivn <<FIM
open $ip1
user $login $senha
binary
lcd INFO
cd $path_subest
pwd
put $arquivo_simtr
bye
FIM

done






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts