search variable and corresponding value in bash -


i have below sample file:

jul 16 00:01:24  abc postfix/smtp[28719]: 51aeqwqwq06: to=<simon.naish@xyz.com>, relay=none, delay=0.17, delays=0.17/0/0/0, dsn=4.4.1, status=deferred (connect 127.0.0.1[127.0.0.1]:10026: connection refused) jul 16 00:01:36  abc postfix/smtp[28655]: e444qw002: to=<r-ff001101082d5bf235740884e558eea95@comms.frong.com>, relay=in.emailct.com[63.20.111.76]:25, delay=39, delays=0.06/0/0.92/38, dsn=2.1.5, status=deliverable (250 2.1.5 r-ff001101082d5bf2355ff8740884e558eea95@comms.thrwwsixtyabc.com ) jul 16 00:01:43  abc postfix/smtp[28815]: f19dwq003: to=<sullcrom@em1.sulivancromwell.com>, relay=em1.sullivancromwell.com[223.222.222.2]:25, delay=162708, delays=162705/0.3/1.6/0.62, dsn=4.2.2, status=deferred (host em1.sullivancromwell.com[223.222.222.2] said: 452 4.2.2 mailbox full (in reply rcpt command)) 

i want display highest integer value of "delay=" , corresponding line file.

sample output:

longest delay was: **162708** on , @ **jul 16 00:01:43** on server **abc**0  jul 16 00:01:43  postfix/smtp[28815]: f19dwq003: to=<sullcrom@emm.sullivanandcromwell.com>, relay=emm.sullivancromwell.com[205.22.33.33]:25, delay=162708, delays=162705/0.3/1.6/0.62, dsn=4.2.2, status=deferred (host emm.sullivancromwell.com[223.222.222.2] said: 452 4.2.2 mailbox full (in reply rcpt command)) 

thanks in advance

all together:

$ data=$(grep -npo '(?<=delay=)\d+' file | sort -rn -t: -k2 | head -1) $ line=${data%%:*} $ delay=${data##*:} $ awk -v line=$line -v delay=$delay 'nr==line {print "longest delay **", delay, "** on", $1, $2, "at", $3, "at server",$4, "\n\n",$0}' file longest delay ** 162708 ** on jul 16 @ 00:01:43 @ server abc    jul 16 00:01:43  abc postfix/smtp[28815]: f19dwq003: to=<sullcrom@em1.sulivancromwell.com>, relay=em1.sullivancromwell.com[223.222.222.2]:25, delay=162708, delays=162705/0.3/1.6/0.62, dsn=4.2.2, status=deferred (host em1.sullivancromwell.com[223.222.222.2] said: 452 4.2.2 mailbox full (in reply rcpt command)) 

explanation (spoiler: can boring)

you can firstly following:

$ grep -npo '(?<=delay=)\d+' file | sort -rn -t: -k2 3:162708 2:39 1:0 

let's split in parts:

$ grep -npo '(?<=delay=)\d+' file 1:0 2:39 3:162708 

gives number of line , value of delay=. want first line, head -1. sort number sort -rn -t: -k2. first row line number:delay.

so have following delay , line:

$ grep -npo '(?<=delay=)\d+' file | sort -rn -t: -k2 | head -1 3:162708 

and

$ line=${data%%:*}  # returns value after : $ delay=${data##*:} # returns value before : 

then time awk:

awk -v line=$line -v delay=$delay 'nr==line {print "longest delay **", delay, "** on", $1, $2, "at", $3, "at server",$4}' file 
  • awk -v var=$some_var gives awk value of session var used inside command.
  • nr==line {} makes actions performed when in line line of file.
  • {print "longest delay **", delay, "** on", $1, $2, "at", $3, "at server",$4, "\n\n",$0} prints data way asked in question. $1, $2... correspond field position in line. $0 corresponds full line.

Comments

Popular posts from this blog

php - Calling a template part from a post -

Firefox SVG shape not printing when it has stroke -

How to mention the localhost in android -