grep - получить слово из строки - PullRequest
0 голосов
/ 12 ноября 2018

У меня есть куча строк, из которых я должен получить 'port_num' из -

"76 : client=new; tags=circ, LINK; port_num=switch01; far_port=Gi1/0"

Слово может находиться в другом месте в строке и может иметь другую длину, но оно всегда говорит: 'port_num =' перед ним и ';' после этого ...

Я хочу только этот бит- 'switch01'

В настоящее время я использую-

| grep -Eo 'port_num=.+' | cut -d"=" -f2 | cut -d";" -f1'

Но должен быть лучший способ

Ответы [ 4 ]

0 голосов
/ 12 ноября 2018

Это можно сделать простой командой sed:

s="76 : client=new; tags=circ, LINK; port_num=switch01; far_port=Gi1/0"
sed 's/.*port_num=\([^;]*\);.*/\1/' <<< "$s"

switch01
0 голосов
/ 12 ноября 2018

Вы можете попробовать grep -oP '(?<=port_num=).+(?=;)', если вы запустите это:

echo "76 : client=new; tags=circ, LINK; port_num=switch01; far_port=Gi1/0" \
| grep -oP '(?<=port_num=).+(?=;)'

Результат будет:

switch01

Обновленный ответ: grep -oP '(?<=port_num=)[^;]+(?=;)'

0 голосов
/ 12 ноября 2018
... | grep -Po 'port_num.+(?=;)'

Используется синтаксис grep совместимого с Perl регулярного выражения (PCRE).(?=;) - это прогнозное утверждение, которое ищет совпадение с ";"но не включает его в соответствующий вывод.

Это приводит к: port_num = switch01

Как заметил @Vladimir Kovpak, если вы хотите исключить строку "port_num =" из этого вывода,добавить скрытое утверждение:

... | grep -Po '(?<=port_num).+(?=;)'
0 голосов
/ 12 ноября 2018

Вот что я бы использовал:

... | grep -E 'port_num=.+' | sed 's/^.*port_num=\([^;]*\).*$/\1/'

Это работает с -o на grep или без него, и доступность -P будет зависеть от версии grep, которая у вас есть. (например, у моего grep его нет). Я не говорю, что другие ответы, основанные на -P, не очень хороши - они выглядят хорошо для меня. Но grep -P будет менее переносимым.

ИМХО, конвейер grep с sed позволяет каждой утилите делать то, на чем она специализируется - grep для выбора строк, sed для изменения строк.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...