Невозможно выполнить grep для определения версии из вывода

Невозможно выполнить grep для определения версии из вывода

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

WVER0010I: Copyright (c) IBM Corporation 2002, 2012; All rights reserved.
WVER0012I: VersionInfo reporter version 1.15.1.48, dated 2/8/12

--------------------------------------------------------------------------------
IBM WebSphere Product Installation Status Report
--------------------------------------------------------------------------------

Report at date and time September 23, 2020 2:00:11 PM IST

Installation
--------------------------------------------------------------------------------
Product Directory        /ihs/IBM/HTTPServer
Version Directory        /ihs/IBM/HTTPServer/properties/version
DTD Directory            /ihs/IBM/HTTPServer/properties/version/dtd
Log Directory            /var/ibm/InstallationManager/logs

Product List
--------------------------------------------------------------------------------
IHS                      installed

Installed Product
--------------------------------------------------------------------------------
Name                  IBM HTTP Server for WebSphere Application Server
Version               8.5.5.10
ID                    IHS
Build Level           cf101629.01
Build Date            7/21/16
Package               com.ibm.websphere.IHS.v85_8.5.5010.20160721_0036
Architecture          x86-64 (64 bit)
Installed Features    IBM HTTP Server 64-bit with Java, Version 6
                      Core runtime

--------------------------------------------------------------------------------
End Installation Status Report
--------------------------------------------------------------------------------

Мне нужно получить версию для всех разновидностей ОС, таких как Aix, Linux и Solaris.

С помощью следующей команды я получаю желаемый результат:

sh /ihs/IBM/HTTPServer/bin/versionInfo.sh | grep -A 1 WebSphere | tail -n 1 | awk '{print $NF}'

Вывод: 8.5.5.10

Однако когда вывод скрипта немного меняется, как показано ниже, та же команда не возвращает мне версию.

WVER0010I: Copyright (c) IBM Corporation 2002, 2005, 2008; All rights reserved.
WVER0012I: VersionInfo reporter version 1.15.5.1, dated 6/15/11

--------------------------------------------------------------------------------
IBM WebSphere Application Server Product Installation Status Report
--------------------------------------------------------------------------------

Report at date and time September 23, 2020 1:54:10 PM GMT+05:30

Installation
--------------------------------------------------------------------------------
Product Directory        /ihs/IBM/HTTPServer
Version Directory        /ihs/IBM/HTTPServer/properties/version
DTD Directory            /ihs/IBM/HTTPServer/properties/version/dtd
Log Directory            /ihs/IBM/HTTPServer/logs
Backup Directory         /ihs/IBM/HTTPServer/properties/version/nif/backup
TMP Directory            /tmp

Product List
--------------------------------------------------------------------------------
IHS                      installed

Installed Product
--------------------------------------------------------------------------------
Name                     IBM HTTP Server
Version                  7.0.0.19
ID                       IHS
Build Level              cf191132.09
Build Date               8/13/11
Architecture             Intel (32 bit)

--------------------------------------------------------------------------------
End Installation Status Report
--------------------------------------------------------------------------------

Выход:

--------------------------------------------------------------------

Однако желаемый результат:

7.0.0.19

Я ожидаю, что одна и та же команда выдаст номер версии для обоих приведенных выше выходных данных.

Примечание: Я думаю, если мы можем найти строку под строкой, начинающейся с, "Name"а <whitespaces>затем с, а затем с "IBM HTTP Server", то мы получим версию. Однако, я не могу получить grepжелаемое.

Можете ли вы подсказать?

решение1

Я бы предложил awkрешение на основе , если такой инструмент вам доступен:

awk '/^Installed Product/{f=1} f && $1=="Version" {print $2; f=0}'

установит флаг, fкак только будет найден заголовок "Installed Product", и (только) затем будет искать строку, начинающуюся с "Version". Он выведет второе из разделенных пробелами полей этой строки, которое является версией. В качестве меры безопасности он одновременно сбросит флаг, чтобы гарантировать, что последующее появление строки "Version" не приведет к генерации ложного вывода.

Вы можете использовать его как

sh /ihs/IBM/HTTPServer/bin/versionInfo.sh | awk '/^Installed Product/{f=1} f && $1=="Version" {print $2; f=0}'

решение2

Исходя из вашего примера ввода, вы просто ищете отрезок чисел, .который следует за словом Versionв строках, где Versionесть первое слово строки, за которым следует пробел и затем число. Если у вас есть GNU grep, вы можете просто сделать:

sh /ihs/IBM/HTTPServer/bin/versionInfo.sh | grep -oP '^Version\s+\K\d.*'

Если у вас нет GNU grep, вы можете использовать:

sh /ihs/IBM/HTTPServer/bin/versionInfo.sh | sed -n 's/^Version[ \t]*\([0-9]\)/\1/p'

Или, возможно, более разборчиво:

sh /ihs/IBM/HTTPServer/bin/versionInfo.sh | 
    awk '/^Version  *[0-9]/{print $2}' 

Связанный контент