grep endereços IP no script de espera

1

Isso faz parte do código em um script de espera, eu tenho um problema com a pesquisa de endereços IP de um arquivo cujo nome está na variável $filename .

#!/usr/local/bin/expect -- 
###Made by Etihkru####


set env(TERM) vt100
set env(SHELL) /bin/sh
set env(HOME) /usr/local/bin
exp_internal 1
set PASSWORD eri
set SIU [lindex $argv 0]
match_max 1000
if {$SIU == ""} {
puts "Missing name of SIU. Run command as perl SIUADD FRTXXX"
exit
}


spawn ssh mashost
set USER admin
set PASS hidden

expect {
    "assword"  {send "$PASSWORD\r"}
}

        expect "ranosusr@rn2osscs603"
        send -- "cd /var/opt/ericsson/edd/ARNE_SIU \r"
        expect "ranosusr@rn2osscs603"
        send -- "grep -il $SIU *\r"
        set prompt {ranosusr@rn2osscs603> }
        expect -re "(FXL\S+\.xml).*$prompt$"
        set filename $expect_out(1,string) 
        send -- "cat $filename | grep 'url=' \r"
        expect -re "something.*$prompt$" //Expect this ip adreess ???
        set IP $expect_out(1,string)//put it to variable IP ???


spawn ssh admin@$ip
expect {
    -re "RSA key fingerprint" {send "yes\r"}
    timeout {puts "Host is known"}
}

expect {
    "assword"  {send "$PASS\r"}
}

expect "Osmon>"
send -- "resumePMMeasurements STN=0,MeasurementDefinition=0 sftp://pmup-rn2sossv605:[email protected]/GRAN/rn2sossv605/$SIU/NeTransientUp \r"
expect "Osmon>"
send -- "getalarmlist \r"
expect -re "(\Operation Succeed\)"
send -- "rev \r"
expect "Osmon>"
send -- "subscribe 10.211.149.40 1 \r"
expect "Osmon>"
send -- "getsubscriptionstatus 1 \r"
expect "Osmon>"
interact

Esta é a saída:

 expect: does "> cat FXL704_FRTAMX_SIU_ARNE.xml | grep 'url=' " (spawn_id exp4) match glob pattern "ranosusr@rn2osscs603"? no
    expect: does "> cat FXL704_FRTAMX_SIU_ARNE.xml | grep 'url=' \r\r\n" (spawn_id exp4) match glob pattern "ranosusr@rn2osscs603"? no
                          <emUrl url="10.80.31.123"/>    
    expect: does "> cat FXL704_FRTAMX_SIU_ARNE.xml | grep 'url=' \r\r\n                  <emUrl url="10.80.31.123"/>\r\r\n" (spawn_id exp4) match glob pattern "ranosusr@rn2osscs603"? no
    ranosusr@rn2osscs603>
    expect: does "> cat FXL704_FRTAMX_SIU_ARNE.xml | grep 'url=' \r\r\n                  <emUrl url="10.80.31.123"/>\r\r\nranosusr@rn2osscs603> " (spawn_id exp4) match glob pattern "ranosusr@rn2osscs603"? yes

Eu preciso do endereço IP puro, limpo de outros caracteres (por exemplo, 10.80.31.123 ), porque preciso usá-lo no próximo login do SSH, portanto, preciso atribuí-lo a uma variável $IP .

    
por user3319356 13.03.2014 / 14:54

1 resposta

2

Seu principal problema é esta linha

cat $filename | grep {1,3\}\.\{1,3\}\.\{1,3\}\.\{1,3\} \r"

Além do uso inútil de cat , o erro principal é que {1,3} significa " jogo 1,2 ou 3 "vezes, mas o seu não dizendo o que para combinar. A sintaxe também está errada, {} precisa ser escapado para grep regular. O que você está procurando é melhor escrito como:

grep -Po '\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}' filename

Isso usa a sintaxe PCRE ( -P ), em que \d significa "dígitos" e que eu acho mais fácil, mas para usar as expressões regulares padrão grep (BREs) que você pode fazer:

grep -o '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}'
  • O -o faz com que grep imprima apenas a parte correspondente da linha.

  • Você nunca quer combinar o caractere de fim de linha, não há necessidade. Você deve sempre tentar tornar suas expressões regulares o mais simples possível. É sempre melhor usar a menor e mais simples expressão que corresponda aos seus dados.

  • Você certamente não deseja pesquisar por \r . Embora o Windows finalize linhas com \r\n , a maioria dos sistemas não o faz e, em qualquer caso, não faz sentido procurar por ele. Se você precisar corresponder ao final de uma linha, use $ , que funcionará em todos os casos.

De qualquer forma, para salvar em uma variável, faça isso:

ip=$(grep -Po '\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}' filename)

Agora você pode ecoar $ip para imprimir o IP.

Com base na sua última edição, estou assumindo que você deseja o ip definido pela tag ipAddress. Agora, darei o aviso obrigatório: NUNCA use expressões regulares para analisar o XML ou formatos semelhantes. Dito isto, para obter apenas o ipAddress IP, faça o seguinte:

ip=$(grep -Po 'ip_v4="\K[0-9.]+' $filename)

O \K descarta o que foi correspondido antes para obter apenas a parte IP e, como você sabe que o IP que está procurando é sempre precedido por ip_v4=" , você pode simplesmente procurar a string mais longa que contém apenas números e . .

    
por 13.03.2014 / 15:34

Tags