awk with if, getline, and another if

Howdy Folks,
It seems like it is always awk that confuses the heck out of me and I even have books and examples.

I have this line:

awk '{if (/clientIP/)(SRV = $NF); if ($2 ~ /BUNDLE-GIM/) getline; if ($2 ~ /r100595/) {print SRV,"BUNDLE-GIM",$2}}' post.txt

to parse this text:

<api gim_list_client_modules clientIP=srv1001
ID=0
####### ENTRY 0 #######
MODULE_ID:          -1
NAME:               COMMON
INSTALLED_VERSION   100_r0_3
SCHEDULED_VERSION   100_r0_3
STATE:              INSTALLED
IS_SCHEDULED:       N
####### ENTRY 1 #######
MODULE_ID:          306
NAME:               GIM
INSTALLED_VERSION   10.1.4_r103106_1
SCHEDULED_VERSION   10.1.4_r103106_1
STATE:              INSTALLED
IS_SCHEDULED:       N
####### ENTRY 2 #######
MODULE_ID:          305
NAME:               SUPERVISOR
INSTALLED_VERSION   10.1.4_r103106_1
SCHEDULED_VERSION   10.1.4_r103106_1
STATE:              INSTALLED
IS_SCHEDULED:       N
####### ENTRY 3 #######
MODULE_ID:          303
NAME:               INIT
INSTALLED_VERSION   10.1.4_r103106_1
SCHEDULED_VERSION   10.1.4_r103106_1
STATE:              INSTALLED
IS_SCHEDULED:       N
####### ENTRY 4 #######
MODULE_ID:          304
NAME:               UTILS
INSTALLED_VERSION   10.1.4_r103106_1
SCHEDULED_VERSION   10.1.4_r103106_1
STATE:              INSTALLED
IS_SCHEDULED:       N
####### ENTRY 5 #######
MODULE_ID:          307
NAME:               BUNDLE-GIM
INSTALLED_VERSION   10.1.4_r103106_1
SCHEDULED_VERSION   10.1.4_r103106_1
STATE:              INSTALLED
IS_SCHEDULED:       N
####### ENTRY 6 #######
MODULE_ID:          340
NAME:               BUNDLE-STAP
INSTALLED_VERSION   10.1.4_r103106_1
SCHEDULED_VERSION   10.1.4_r103106_1
STATE:              INSTALLED
IS_SCHEDULED:       N
<api gim_list_client_modules clientIP=srv1002
ID=0
####### ENTRY 0 #######
MODULE_ID:          -1
NAME:               COMMON
INSTALLED_VERSION   10.1.2_r0_3
SCHEDULED_VERSION   10.1.2_r0_3
STATE:              INSTALLED
IS_SCHEDULED:       N
####### ENTRY 1 #######
MODULE_ID:          7
NAME:               GIM
INSTALLED_VERSION   10.1.2_r100595_1
SCHEDULED_VERSION   10.1.2_r100595_1
STATE:              INSTALLED
IS_SCHEDULED:       N
####### ENTRY 2 #######
MODULE_ID:          10
NAME:               SUPERVISOR
INSTALLED_VERSION   10.1.2_r100595_1
SCHEDULED_VERSION   10.1.2_r100595_1
STATE:              INSTALLED
IS_SCHEDULED:       N
####### ENTRY 3 #######
MODULE_ID:          8
NAME:               INIT
INSTALLED_VERSION   10.1.2_r100595_1
SCHEDULED_VERSION   10.1.2_r100595_1
STATE:              INSTALLED
IS_SCHEDULED:       N
####### ENTRY 4 #######
MODULE_ID:          9
NAME:               UTILS
INSTALLED_VERSION   10.1.2_r100595_1
SCHEDULED_VERSION   10.1.2_r100595_1
STATE:              INSTALLED
IS_SCHEDULED:       N
####### ENTRY 5 #######
MODULE_ID:          11
NAME:               BUNDLE-GIM
INSTALLED_VERSION   10.1.2_r100595_1
SCHEDULED_VERSION   10.1.2_r100595_1
STATE:              INSTALLED
IS_SCHEDULED:       N
<api gim_list_client_modules clientIP=srv1003
ID=0
####### ENTRY 0 #######
MODULE_ID:          -1
NAME:               COMMON
INSTALLED_VERSION   100_r0_3
SCHEDULED_VERSION   100_r0_3
STATE:              INSTALLED
IS_SCHEDULED:       N
####### ENTRY 1 #######
MODULE_ID:          101
NAME:               GIM
INSTALLED_VERSION   10.1.3_r101342_1
SCHEDULED_VERSION   10.1.3_r101342_1
STATE:              INSTALLED
IS_SCHEDULED:       N
####### ENTRY 2 #######
MODULE_ID:          100
NAME:               SUPERVISOR
INSTALLED_VERSION   10.1.3_r101342_1
SCHEDULED_VERSION   10.1.3_r101342_1
STATE:              INSTALLED
IS_SCHEDULED:       N
####### ENTRY 3 #######
MODULE_ID:          98
NAME:               INIT
INSTALLED_VERSION   10.1.3_r101342_1
SCHEDULED_VERSION   10.1.3_r101342_1
STATE:              INSTALLED
IS_SCHEDULED:       N
####### ENTRY 4 #######
MODULE_ID:          99
NAME:               UTILS
INSTALLED_VERSION   10.1.3_r101342_1
SCHEDULED_VERSION   10.1.3_r101342_1
STATE:              INSTALLED
IS_SCHEDULED:       N
####### ENTRY 5 #######
MODULE_ID:          102
NAME:               BUNDLE-GIM
INSTALLED_VERSION   10.1.3_r101342_1
SCHEDULED_VERSION   10.1.3_r101342_1
STATE:              INSTALLED
IS_SCHEDULED:       N

and my results are:

clientIP=srv1002 BUNDLE-GIM 10.1.2_r100595_1
clientIP=srv1002 BUNDLE-GIM 10.1.2_r100595_1
clientIP=srv1002 BUNDLE-GIM 10.1.2_r100595_1
clientIP=srv1002 BUNDLE-GIM 10.1.2_r100595_1
clientIP=srv1002 BUNDLE-GIM 10.1.2_r100595_1
clientIP=srv1002 BUNDLE-GIM 10.1.2_r100595_1
clientIP=srv1002 BUNDLE-GIM 10.1.2_r100595_1
clientIP=srv1002 BUNDLE-GIM 10.1.2_r100595_1
clientIP=srv1002 BUNDLE-GIM 10.1.2_r100595_1
clientIP=srv1002 BUNDLE-GIM 10.1.2_r100595_1

What I really want is to add an && so that I only print when $2 contains BUNDLE-GIM and $2 of the very next line contains r100595 but I cannot figure out how to do it.

Thanks for your attention,
T

Try

awk '{if (/clientIP/)(SRV = $NF); if ($2 ~ /BUNDLE-GIM/) {getline; G=1}; if (G && $2 ~ /r100595/) print SRV,"BUNDLE-GIM",$2; G=0}' file
clientIP=srv1002 BUNDLE-GIM 10.1.2_r100595_1

EDIT: or, to improve readability

awk '
/clientIP/              {SRV = $NF
                        }
$2 ~ /BUNDLE-GIM/       {getline
                         if ($2 ~ /r100595/) print SRV,"BUNDLE-GIM",$2
                        }
' file

Please be aware that this assumes that there always will be a line to get so error handling has been skipped.

1 Like

Thank you, Rudi!

Alternative approaches you could try:

awk '
  {
    for(i=9; i<=NF; i++)
      if($i=="BUNDLE-GIM" && $(i+2)~/r100595/)
        print $3, $i, $(i+2)
  }
' RS=\< file
awk '/<api/{s=$NF} /r100595/ && p=="BUNDLE-GIM" {print s, p, $NF} {p=$NF}' file
1 Like

I like this quite a bit!

awk '/<api/{s=$NF} /r100595/ && p=="BUNDLE-GIM" {print s, p, $NF} {p=$NF}' file

as it is very clean.

Thank you, Scrutinizer.