Intereting Posts
Получить «текстовое содержимое» файлов Обнаружение пересылки агента SSH Невозможно установить BIND dns с yum на Oracle Enterprise Linux 6.1 Почему uname -M возвращает пустую строку? Как команда netstat подходит для разных уровней модели TCP / IP на диаграмме производительности? Просмотр stdout / stderr службы systemd Измените файлы с помощью редактора, которому необходимы права sudo Есть ли какая-либо переменная env для включения –color (и т.п.) для всех команд? Скрипт для запуска приложения с выделенной графической картой (Fedora 25) Как быстро найти 20 последних измененных файлов в Mac OS X (вместо использования Python)? Есть ли встроенное средство сжатия свопа (например, Compcache) для FreeBSD? Ошибка: GOPATH не установлен Как декодировать 6-значный файловый режим в AIX? Как использовать определенный интерфейс для определенного IP-адреса назначения? Что такое «прошивка» в терминологии Linux?

grep IP-адреса в сценарии ожиданий

Это часть кода в сценарии ожидания, у меня проблема с поиском IP-адресов из файла, имя которого находится в переменной $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:eric@10.211.149.60/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 

Это вывод:

  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 

Мне нужен чистый IP-адрес, очищенный от других символов (например, 10.80.31.123 ), потому что мне нужно использовать его в следующем входе в SSH, поэтому мне нужно назначить его переменной $IP .

Основная проблема заключается в этой строке

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

Помимо бесполезного использования кошки , главная ошибка заключается в том, что {1,3} означает «матч 1,2 или 3 раза», но вы не говорите ему, что нужно сочетать. Синтаксис также неверен, {} необходимо экранировать для регулярного grep . То, что вы ищете, лучше написано так:

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

Это использует синтаксис PCRE ( -P ), где \d означает «цифры», и который я нахожу более простым, но использую стандартные регулярные выражения grep (BRE), которые вы могли бы сделать:

 grep -o '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}' 
  • -o делает grep печатать только соответствующую часть линии.

  • Вы никогда не хотите соответствовать символу конца строки, в этом нет необходимости. Вы всегда должны стараться делать ваши регулярные выражения максимально простыми. Всегда лучше использовать наименьшее, простое выражение, которое соответствует вашим данным.

  • Вы, конечно же, не хотите искать \r . В то время как Windows завершает строки с помощью \r\n , в большинстве систем нет и в любом случае нет смысла искать его. Если вам нужно соответствовать концу строки, используйте $ который будет работать во всех случаях.

В любом случае, чтобы сохранить в переменной, выполните следующие действия:

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

Теперь вы можете отменить $ip для печати IP.


Основываясь на вашем последнем изменении, я предполагаю, что вы хотите, чтобы ip определялся тегом ipAddress. Теперь я предоставлю вам обязательное предупреждение: НИКОГДА не используйте регулярные выражения для анализа XML или подобных форматов. Тем не менее, чтобы получить IP-адрес IPAddress, сделайте следующее:

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

\K отбрасывает все, что было согласовано до этого, поэтому вы получаете только часть IP, и, поскольку вы знаете, что IP-адрес, который вам ip_v4=" всегда предшествует ip_v4=" , вы можете просто искать самую длинную строку, содержащую только числа и.