Ожидайте использования вывода

Это должно работать:

$ perl -pe 's/^(.+?)_.+?:(.+?),.*?\](.+?)\[.*/$1: $2:$3/' file 
CreateOrder: 2015-09-29 15:42:06: Error description 
ScheduleOrder: 2015-09-29 15:42:06: Error description 2 
ScheduleOrder: 2015-09-29 15:42:06: Error description 3 
ShipOrder: 2015-09-29 15:42:06: Error description 4 

Объяснение

  • perl -pe: -p означает "вывести каждую строку после применения сценария, заданного -e"
  • s/^(.+?)_.+? :(.+?),.*?\](.+?)\[.*/$1: $2:$3/ : регулярное выражение ищет все до первого _ (.+?_) и сохраняет это как $1. Затем все до первого : и все после него до первой запятой (.+?,) сохраняется как $2. Затем он пропускает до первого ] (.*?\]) и сохраняет все после него до первого [ (.+?\[) как $3. Наконец, он также сохраняет все до конца строки. Все это заменяется на $1: $2: $3.
1
26.11.2018, 01:47
1 ответ

Есть два экземпляра 1.1.1.1; при условии, что первый экземпляр подходит для сопоставления, сначала нужно написать простой сценарий, который генерирует требуемый вывод, а также включает поддельные подсказки, которые более или менее выполняются удаленным устройством :

.
#!/usr/bin/env expect
proc prompt {} { puts "prompt"; gets stdin; }
prompt
puts "Last update from 1.1.1.1 1d06h ago"
puts "  Routing Descriptor Blocks:"
puts "  * 1.1.1.1 from 2.2.2.2"
prompt

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

$ (echo consume; echo generate) | entr./consume
...

, который запускает сценарий consumeв любое время при изменении одного из сценариев consumeили generate. Затем я могу возиться со сценариями, чтобы взаимодействовать с подсказками, найти требуемый вывод и применить к нему регулярное выражение (прочитать regexp(n)руководство ):

#!/usr/bin/env expect
spawn -noecho./generate

expect -ex prompt
send -- "before\r"

expect -ex prompt
# this is what I used to confirm that the required prompt block
# had been matched
#puts ">>>$expect_out(buffer)<<<"

regexp {Last update from ([^ ]+) } $expect_out(buffer) unused theip
puts ">>>$theip<<<"

send -- "after\r"
expect eof

этот метод предполагает, что желаемый вывод заключен в подсказки; другим вариантом может быть expectстрока Last update...с регулярным выражением, но это может быть более сложным. Также это совпадение IP-адреса действительно может соответствовать чему угодно; используйте более точное регулярное выражение, если вам нужно проверить, что текст действительно является IP-адресом.

разные заботы:

  • Время ожидания очень мало;что произойдет, если какая-либо из задействованных систем или сетей будет работать медленно, а получение вывода займет больше времени, чем заданный тайм-аут?
  • Проверка ошибок невелика, что произойдет, если система sshвместо этого выдаст ошибку ключа хоста или приглашение, или...
0
28.01.2020, 00:36

Теги

Похожие вопросы