2015-02-27 4 views
1

В настоящее время у меня есть скрипт, который входит в систему и запускает команду. Результаты команды похожи на это:Захват ключевых слов из вывода в tcl

version: xxxx 
date of installation: yyyyy 
all other random stuff 
which takes up a whole 
lot of other lines 

Поскольку я бегу это на многих различных устройств (одного и того же типа), ключевые слова version и date of installation всегда будет то же самое. Я хочу запечатлеть и yyyy, которые будут отличаться в зависимости от устройства.

возможность:

  1. Захват всего вывода и использование Баша выделить слово сразу после версии: или сразу после установки:

  2. с использованием самого Tcl, чтобы сохранить слово после версии: и установка : в файл

Как мне сделать выбор 2? Я пытался Просматривая регулярное выражение из Tcl, но не мог придумать решение

Пересмотренный код, который дает ошибку:

foreach line [split $expect_out(buffer) "\n"] to set $line { 
# if ([regexp {^version:} $line ] || [regexp {^date of } $line]){ 
    regexp {^version: (.+)} $line fullmatch vsn 
    puts $fileId $vsn 
    regexp {^date of installation: (.+)} $line fullmatch install 
    puts $fileId $install 
#} 
} 

не был слишком уверен, если заявление, так что я аннулировал его , Остальная часть кода по-прежнему возвращает ошибку, говорящую о такой переменной для vsn

ответ

1

Предполагая, что вы читаете свой вывод строкой, скажем, в переменную $line, вы можете получить данные, которые вы ищете, выполнив следующие совпадения:

regexp {^version: (.+)} $line fullmatch vsn 
regexp {^date of installation: (.+)} $line fullmatch install 

Символ ^ привязывает соответствие к началу строки. В обоих случаях полное совпадение сохраняется в $fullmatch, но часть, которую вы хотите, которая сопоставляется в круглых скобках, сохраняется во второй переменной ($vsn для первого совпадения и $install для второго матча).

+0

Я искал этот синтаксис, спасибо! – user2883071

+0

Так что это имеет смысл, но как я могу прочитать вывод по строкам, я принимал весь вывод как таковой: expect_output (buffer) – user2883071

+0

В этом случае вы можете настроить цикл как 'foreach line [split $ expect_out (buffer) "\ n"] ', чтобы установить' $ line' в каждую строку данных, а затем проверить регулярные выражения в теле цикла. –

Смежные вопросы