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 lineline
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
Post a Comment