Извлечь весь текст до сопоставленного текста до следующего совпадения - PullRequest
0 голосов
/ 27 марта 2019

Я пытаюсь извлечь текст из вывода команды «multipath -l» с помощью регулярного выражения, чтобы получить весь текст (включая строки сопоставленного текста) между совпадающим именем дискового устройства, например «sdaf», и сопоставить обратно до следующей строки, начинающейся сmpath (в данном случае mpathf).Количество строк варьируется, поэтому я не могу использовать «grep -B».

Итак, из этого примера

mpatha (360060160e6e04400e819a6ac680fe811) dm-7 DGC,VRAID
size=50G features='1 queue_if_no_path' hwhandler='1 emc' wp=rw
|-+- policy='round-robin 0' prio=0 status=active
| |- 0:0:6:0  sdw  65:96  active undef running
| `- 0:0:5:0  sdt  65:48  active undef running
`-+- policy='round-robin 0' prio=0 status=enabled
  |- 0:0:4:0  sdq  65:0   active undef running
  `- 0:0:7:0  sdz  65:144 active undef running
mpathf (36006016016003f00cf52bfe07b10e811) dm-2 DGC,VRAID
size=50G features='1 queue_if_no_path' hwhandler='1 emc' wp=rw
|-+- policy='round-robin 0' prio=0 status=active
| |- 0:0:1:20 sdh  8:112  active undef running
| |- 2:0:9:20 sdan 66:112 active undef running
| |- 0:0:2:20 sdl  8:176  active undef running
| `- 2:0:6:20 sdav 66:240 active undef running
`-+- policy='round-robin 0' prio=0 status=enabled
  |- 0:0:0:20 sdd  8:48   active undef running
  |- 2:0:8:20 sdaj 66:48  active undef running
  |- 0:0:3:20 sdp  8:240  active undef running
  |- 2:0:7:20 sdar 66:176 active undef running
  `- 2:0:5:20 sdaf 65:240 active undef running

Я хочу получить текст

mpathf (36006016016003f00cf52bfe07b10e811) dm-2 DGC,VRAID
size=50G features='1 queue_if_no_path' hwhandler='1 emc' wp=rw
|-+- policy='round-robin 0' prio=0 status=active
| |- 0:0:1:20 sdh  8:112  active undef running
| |- 2:0:9:20 sdan 66:112 active undef running
| |- 0:0:2:20 sdl  8:176  active undef running
| `- 2:0:6:20 sdav 66:240 active undef running
`-+- policy='round-robin 0' prio=0 status=enabled
  |- 0:0:0:20 sdd  8:48   active undef running
  |- 2:0:8:20 sdaj 66:48  active undef running
  |- 0:0:3:20 sdp  8:240  active undef running
  |- 2:0:7:20 sdar 66:176 active undef running
  `- 2:0:5:20 sdaf 65:240 active undef running

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

1 Ответ

0 голосов
/ 27 марта 2019

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

multipath.awk:

        {output = output "\n" $0}   /* store line in variable */
/^mpath/ {output = $0}              /* reset buffer */
/sdaf/   {print output}             /* print buffer */

Я получаю ваш результат с файлом multipath.txt, который соответствует вашему примеру (я не установил инструмент многолучевого распространения). Я запустил его с:

awk -f multipath.awk multipath.txt

Вы можете написать команду awk в одну строку:

 multipath -l | awk    '{output = output "\n" $0}   /^mpath/ {output = $0}   /sdaf/   {print output}' 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...