Форматирование и фильтрация очередей IBM MQ

Вопрос или проблема

Мне нужно отобразить каждую очередь менеджера очередей IBM MQ вместе с её глубиной.

Я могу сделать это с помощью команды echo DISPLAY QLOCAL(QE*) WHERE(CURDEPTH GE 0) | runmqsc QMNAME.
Вывод похож на этот:

5724-H72 (C) Copyright IBM Corp. 1994, 2023.
Запуск MQSC для менеджера очередей QMNAME.

     1 : DISPLAY QLOCAL(QE*) WHERE(CURDEPTH GE 0)
AMQ8409I: Отображение деталей очереди.
   QUEUE(QE.QUEUE.NAME1)          TYPE(QLOCAL)
   CURDEPTH(2)
AMQ8409I: Отображение деталей очереди.
   QUEUE(QE.QUEUE.NAME2)          TYPE(QLOCAL)
   CURDEPTH(90)
AMQ8409I: Отображение деталей очереди.
   QUEUE(QE.QUEUE.NAME.QUEUE.NAME.QUEUE.NAME3)
   TYPE(QLOCAL)                            CURDEPTH(1)
AMQ8409I: Отображение деталей очереди.
   QUEUE(QE.QUEUE.NAME.QUEUE.NAME.QUEUE.NAME4)
   TYPE(QLOCAL)                            CURDEPTH(0)
AMQ8409I: Отображение деталей очереди.
   QUEUE(QE.QUEUE.NAME5)      TYPE(QLOCAL)
   CURDEPTH(0)
AMQ8409I: Отображение деталей очереди.
   QUEUE(QE.QUEUE.NAME.QUEUE.NAME6)
   TYPE(QLOCAL)                            CURDEPTH(0)
AMQ8409I: Отображение деталей очереди.
   QUEUE(QE.QUEUE.NAME7)     TYPE(QLOCAL)
   CURDEPTH(0)
Команда MQSC прочитана.
Нет команд с ошибками синтаксиса.
Все действительные команды MQSC были обработаны.

Обратите внимание, что у некоторых очередей длинные имена, и вывод сдвигает поля “TYPE” и “CURDEPTH” вниз и вправо.

Моя цель – отобразить эти очереди как [TYPE] - [QUEUE.NAME] - [DEPTH]:

QLOCAL - QE.QUEUE.NAME.QUEUE.NAME.QUEUE.NAME3 - 1

Я пытаюсь использовать либо sed, либо awk для достижения этой цели, и это некоторые из моих попыток:

С помощью awk

awk -F'(QUEUE|TYPE|CURDEPTH)' '/QUEUE\(.*\)/{printf "%s - %s - ", $2, $3}/CURDEPTH/{printf "%s\n", $2}'

$ echo DISPLAY QLOCAL(QE*) WHERE(CURDEPTH GE 0) | runmqsc QMNAME | cat teste | awk -F'(QUEUE|TYPE|CURDEPTH)' '/QUEUE\(.*\)/{printf "%s - %s - ", $2, $3}/CURDEPTH/{printf "%s\n", $2}'
 GE 0)
(QE.QUEUE.NAME1)                - (QLOCAL) - (0)
(QE.QUEUE.NAME2)                - (QLOCAL) - (0)
(QE.QUEUE.NAME.QUEUE.NAME.QUEUE.NAME3) -  - (QLOCAL)
(QE.QUEUE.NAME.QUEUE.NAME.QUEUE.NAME4) -  - (QLOCAL)
(QE.QUEUE.NAME5)                - (QLOCAL) - (0)
(QE.QUEUE.NAME.QUEUE.NAME6) -  - (QLOCAL)
(QE.QUEUE.NAME7)                - (QLOCAL) - (0)

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

С помощью sed

sed -rn 's|QUEUE\((.*)\)\s+TYPE\((.*)\)\s+CURDEPTH\((\d+)\)|\2 - \1 - \3|p'

$ echo DISPLAY QLOCAL(QE*) WHERE(CURDEPTH GE 0) | runmqsc QMNAME | sed -rn 's|QUEUE\((.*)\)\s+TYPE\((.*)\)\s+CURDEPTH\((\d+)\)|\2 - \1 - \3|p'
$ echo DISPLAY QLOCAL(QE*) WHERE(CURDEPTH GE 0) | runmqsc QMNAME | sed -rn 's|QUEUE\((.*)\)\s+TYPE\((.*)\)|\2 - \1|p'
   QLOCAL - QUEUE.NAME1
   QLOCAL - QUEUE.NAME2
   QLOCAL - QE.QUEUE.NAME.QUEUE.NAME.QUEUE.NAME3
   QLOCAL - QE.QUEUE.NAME.QUEUE.NAME.QUEUE.NAME4
   QLOCAL - QE.QUEUE.NAME5
   QLOCAL - QE.QUEUE.NAME.QUEUE.NAME6
   QLOCAL - QE.QUEUE.NAME7

sed ничего не показывает, когда я добавляю выражение \s+CURDEPTH. Только когда я удаляю его, он показывает очереди, но тогда я теряю значение глубины.

Можете ли вы дать мне какие-то рекомендации по этому поводу?

Ответ или решение

Форматирование и фильтрация очередей IBM MQ

Современные системы управления сообщениями, такие как IBM MQ, обеспечивают надежный обмен данными между различными приложениями. Ваша задача — корректно отобразить информацию о локальных очередях (QLocal) и их текущей глубине. Давайте рассмотрим, как можно эффективно обработать вывод команды runmqsc для получения нужного вам формата.

Проблема

Вы используете команду:

echo DISPLAY QLOCAL(QE*) WHERE(CURDEPTH GE 0) | runmqsc QMNAME

В результате которой получаете вывод, требующий дополнительной обработки для формирования желаемого вида:

[TYPE] - [QUEUE.NAME] - [DEPTH]

Однако у вас возникают трудности с форматированием длинных имен очередей, что приводит к смещению полей TYPE и CURDEPTH.

Решение через awk

Давайте использовать инструмент awk, который позволит вам оптимально организовать обработку строк. Вы можете попробовать следующий подход:

echo DISPLAY QLOCAL(QE*) WHERE(CURDEPTH GE 0) | runmqsc QMNAME | awk '
/QUEUE\((.*)\)/ { 
    queue = $2; 
    type = ""; 
}
/TYPE\((.*)\)/ { 
    type = $2; 
}
/CURDEPTH\((\d+)\)/ { 
    depth = $2; 
    if (type != "") { 
        printf "%s - %s - %s\n", type, queue, depth; 
    } 
}'

Решение через sed

Если вы предпочитаете использовать sed, есть возможность задать регулярное выражение, которое подстроится под ваш случай. Попробуйте следующий вариант:

echo DISPLAY QLOCAL(QE*) WHERE(CURDEPTH GE 0) | runmqsc QMNAME | sed -rn '
    s|QUEUE\((.*?)\).*TYPE\((.*?)\).*CURDEPTH\((\d+)\)|\2 - \1 - \3|p
'

Объяснение подхода

  1. awk вариант:

    • Использование условных конструкций позволяет вам собирать значения для имени очереди, типа и глубины.
    • Ваша цель заключается в том, чтобы избежать смещения полей, и этот подход гарантирует, что каждая строка будет выведена в правильном формате.
  2. sed вариант:

    • Регулярное выражение разбирает строку на части и собирает их в нужном порядке.
    • Использование .* вместо \s+ позволяет обрабатывать пробелы, независимо от их количества.

Заключение

Оба приведенных выше подхода позволят вам получить нужный формат вывода для локальных очередей IBM MQ. Не забудьте протестировать выбранный вами метод в вашем окружении, чтобы удостовериться в его корректности. Если у вас возникнут дополнительные вопросы или потребуются более сложные операции, не стесняйтесь задавать вопросы.

Оцените материал
Добавить комментарий

Капча загружается...