Извлеките строку, которая расположена выше и ближе к соответствующему шаблону в многострочном выводе - PullRequest
0 голосов
/ 27 июня 2018

Ниже приведена команда HP ssacli для просмотра сведений о сконфигурированном аппаратном RAID:

ssacli ctrl slot=0 show config

, и его вывод как указано ниже:

HPE Smart Array P408i-a SR Gen10 in Slot 0 (Embedded)



   Internal Drive Cage at Port 1I, Box 1, OK



   Internal Drive Cage at Port 2I, Box 0, OK


   Port Name: 1I (Mixed)

   Port Name: 2I (Mixed)

   Array A (Solid State SAS, Unused Space: 0  MB)

      logicaldrive 1 (447.10 GB, RAID 1, OK)

      physicaldrive 1I:1:1 (port 1I:box 1:bay 1, SAS SSD, 480 GB, OK)
      physicaldrive 1I:1:2 (port 1I:box 1:bay 2, SAS SSD, 480 GB, OK)

   SEP (Vendor ID HPE, Model Smart Adapter) 379  (Port: Unknown)

Мне нужно выяснить имя Array , чтобы удалить его, выполнив поиск соответствующей информации о диске, которую я получаю в качестве ввода от пользователя. Например, если на диске введено значение 1I:1:1, я должен искать эту строку в выходных данных вышеупомянутой команды. Поскольку этот диск доступен и соответствует, мне нужно извлечь имя массива (здесь оно A), и как только я получу этот параметр массива, я смогу удалить существующую конфигурацию RAID.

ssacli ctrl slot=0 show config | grep -B 4 '1I:1:1' | grep Array | awk '{print $2}'

Проблема с вышеприведенной командой:

  1. значение 4 в grep -B не всегда может быть постоянным, поскольку совпадающий диск может находиться первым, вторым или третьим и т. Д. Под массивом на выходе.

  2. может быть несколько конфигураций RAID-массива, доступных в выходных данных, поэтому могут быть массивы A, B, C и т. Д., Я должен найти и извлечь ближайшую строку Array, которая соответствует моему входному диску

Ответы [ 2 ]

0 голосов
/ 27 июня 2018

Вы можете обработать файл с конца:

tac infile \
    | awk -v input='1I:1:1' '$0 ~ input {flag=1} flag && /Array/ {print $2; exit}'

Устанавливает флаг при обнаружении строки, совпадающей с пользовательским вводом; после этого, если строка соответствует Array и установлен флаг, печатается второе поле.

0 голосов
/ 27 июня 2018

Я думаю, что ваше требование может быть просто решено с помощью одного использования awk. Вы сохраняете имя диска как передаваемую переменную и сначала сохраняете имена массивов по мере прохождения списка строк. Как только вы сделаете совпадение с реальным именем диска, вы распечатаете массив, который вы только что сохранили. Так что направьте вывод вашей команды в

| awk -v disk="1I:1:1" '/^[[:space:]]*Array/{ array=$2; } $0 ~ disk { print array; exit  }' 

Этот ответ предполагает , что имена массивов не содержат пробелов, иначе он будет разбит и выведет только первую часть имени массива.

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