2016-07-08 3 views
1

У меня 2 вида сообщений:подстроки с помощью SED

  • Board2Port1TS239.124.3.20:3000

  • Board4UserTagZDF_pippo_MFPService8011

Если я получаю сообщение 1 (он содержит Port) вывод должен быть Board2Port1

Если я получу сообщение 2 (оно не содержит Port) вывод должен быть Board4

Числа Board и Port не являются фиксированными.

/bin/echo "Board2Port1TS239.124.3.20:3000" | /bin/sed -e '/Port/ s/???/???/ ; /Port/! s/???/???/' 

Я не могу найти решение ... может ли кто-нибудь мне помочь? спасибо


Большое спасибо Novocaine за идеальное решение.

У меня есть другой questione, непосредственно связанную с предыдущей:

с помощью оболочки решение в порядке:

[[email protected] snmptt]# /bin/echo 'Board2Port1TS239.124.3.21:3000' | /bin/sed -r 's/^(Board.(Port.)*).*/\1/g' 
Board2Port1 

Теперь я должен использовать эту команду внутри конфигурации SNMPTT. Это не работает. Это отчет snmptt.debug

Done performing substitution on PREEXEC line: /bin/echo 'Board2Port1TS239.124.3.21:3000' | /bin/sed -r 's/^(Board.(Port.)*).*/\1/g' 
PREEXEC command: /bin/echo 'Board2Port1TS239.124.3.21:3000' | /bin/sed -r 's/^(Board.(Port.)*).*/\1/g' 
    command output: Board2Port1TS239.124.3.21:3000 

Команда конфигурации Файл:

PREEXEC /bin/echo '$p2' | /bin/sed -r 's/^(Board.(Port.)*).*/\1/g' 

выход "Board2Port1TS239.124.3.21: 3000" равно входному ($ p2). Почему я не согласен.

Заранее спасибо

ответ

0

Предполагая, что вы получите одно сообщение каждый раз, когда:

sed '/:/{s/\([0-9]\)[^0-9].*:/\1/;q};s/\([0-9]\)[^0-9].*/\1/' 

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

kent$ sed '/:/{s/\([0-9]\)[^0-9].*:/\1/;q};s/\([0-9]\)[^0-9].*/\1/' <<< "Board2Port1TS239.124.3.20:3000"                 
Board23000 

kent$ sed '/:/{s/\([0-9]\)[^0-9].*:/\1/;q};s/\([0-9]\)[^0-9].*/\1/' <<< "Board4whatever3000"    
Board4 
+0

Привет, это неверно: сообщения содержат всегда слово «Совет», иногда содержат порт ИЛИ UserTag. Мне нужно выполнить чек с портом. Если порт присутствует, выход должен быть BoardxPorty Если Порт отсутствует, то должен быть Boardp –

+0

@MarcoMurtas Вы не указали, что в вашем файле ввода фиксированный текст (Board/Port). Исправленный материал обычно облегчает задачу. По крайней мере, этот ответ показал вам, как я думал, чтобы решить эту проблему. Время от времени вход может меняться, однако идея приходит к решению - ключевой момент.мои 2центы. – Kent

+0

@MarcoMurtas хорошо, возможно, я неправильно понял ваш 'содержит порт' .. Я думал, что он содержит номер порта (или нет). – Kent

1
sed -r 's/^(Board.(Port.)*).*/\1/g' File 
+1

Я думаю, что это вполне приемлемый ответ. –

+0

Он отлично работает. Большое спасибо вам и всем остальным предложениям. –

0

Предполагая, что вход действительно выглядит ваш пример, и что Port и UserTag являются фиксированными строками:

sed -r '/Port/{s/TS.*//;n};s/UserTag.*//' 
+0

Привет, это неверно: сообщения содержат всегда слово Board, иногда содержат порт ИЛИ UserTag. Мне нужно выполнить чек с портом. Если порт присутствует, выход должен быть BoardxPorty Если порт отсутствует, то на выезде должен быть Board4 –

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