Ожидайте, что Script grep и awk будут использоваться как переменные - PullRequest
0 голосов
/ 13 декабря 2018

Я посмотрел и не вижу вопроса, похожего на этот.У меня есть сценарий ожидания, который входит в удаленные системы и может отправлять команды.У меня есть особый случай, когда мне нужно отправить команду, основанную на выводе предыдущей команды.

Я регистрирую сеанс каждого хоста, в который я вхожу, в файл, так что мой план игры состоял в том, чтобы возможно получить этот журналфайл для нужного мне значения, чтобы затем я мог передать его следующим нескольким командам.

Например.SSH к устройству.Отправьте команду, результатом которой будет строка со значением $ this_host.log: возвращает экземпляр: 541 (намеренно пропустили часть выходных данных). В оболочке вы можете просто получить часть 541, выполнив следующее: grep «возвращает экземпляр» *.журнал |awk '{print $ 7}'

Ожидается, что я хотел бы сохранить это значение 541 в переменной, чтобы затем я мог выполнить: send "next.command. $ value", где значение равно 541. 541просто пример, так как это может быть любое 3-значное число там.

Я не уверен, как конвертировать этот grep |awk combo, чтобы ожидать формат.Я постоянно использую эти комбинации в обычных сценариях оболочки: например, UPTIME = "$ (grep -E" Время работы системы: "$ log | awk '{print $ 3 $ 4 $ 5 $ 6 $ 7 $ 8}')"

1 Ответ

0 голосов
/ 13 декабря 2018

Не делай этого.Вы уже ожидаете: ожидайте, автоматизирует интерактивный сеанс: вы можете захватить вывод команд, которые вы отправляете.

Пример: вы подключены к удаленной системе и хотите отправить dateкоманда.Ваше приглашение - это имя хоста, за которым следует $, за которым следует пробел.Визуально вы увидите следующее:

host$ date
Wed Dec 12 20:48:57 EST 2018
host$

В ожидаемом направлении вы сделаете следующее:

expect -re {\$ $}
send "date\r"
expect -re {(.+)\$ $}

На данный момент $expect_out(1,string) содержит следующий текст: date\r\nWed Dec 12 20:48:57 EST 2018\r\nhost.Немного неприятно, что вы получаете команду, а также запуск подсказки, но с обработкой строки Tcl мы можем довольно легко ее обработать:

set lines [split $expect_out(1,string) \n]
set no_cr [lmap line $lines {string {map "\r" ""} $line}]
set command_out [join [lrange $no_cr 1 end-1] \n]
...