Retrieve string from each line in a file based on a pattern in Unix

I have a file which contains several lines. Sample content of the file is as below.

OK    testmessage    email<test@123>
NOK    receivemessage    email<123@test>
NOK    receivemessage    email(123@test123)
NOK    receivemessage    email<abc@test>

i would like to know by scripting will it be possible to retrive just the mail addresses based on string provided, value is 'OK' or 'NOK'.

If i provide search string as 'NOK', i need the output as,

123@test
123@test123
abc@test

please note, email addresses are wrapped in either () or <> brackets.

Please let me know your comments.

p.s: i m new to scripting...

sed -n "/^NOK/s/.*[(<]\(.*\)[)>]/\1/p" infile
123@test
123@test123
abc@test

Or if your awk supports multi-character file-separators:

awk -F"[()<>]" '/^NOK/ { print $2 }' infile
123@test
123@test123
abc@test

With sed:

sed -n 's/^NOK.*[<(]\([^>)]*\)[)>].*/\1/p' infile
123@test
123@test123
abc@test

bash

read -p "Enter search string: " search
while read -r a b c
do
    case "$a" in
       "$search")
            c=${c/email/}
            echo ${c//[(<)>]/};;
    esac
done <"file"

output

$ ./shell.sh
Enter search string: NOK
123@test
123@test123
abc@test

I am trying with the below content & it is not working.

2008-06-17 15:32 delivery 12473185: failure: NOK:_<test123@abc.com>/Thanks/
2008-06-17 15:32 delivery 12473115: success: OK:_<test121@abc.com>/Thanks/
2008-06-17 15:32 delivery 12473125: failure: NOK:_<test124@abc.com>/Thanks/
2008-06-17 15:32 delivery 12473135: failure: NOK:_<test125@abc.com>/Thanks/
2008-06-17 15:32 delivery 12473145: failure: NOK:_(test126@abc.com)/Thanks/
2008-06-17 15:32 delivery 12473155: success: OK:_<test127@abc.com>/Thanks/
2008-06-17 15:32 delivery 12473165: failure: NOK:_<test128@abc.com>/Thanks/

can you please check this?

Try:
for searching OK

sed -n '/ OK/ { s!.*OK:_[<(]\(.*@.*\)[>)]/Thanks/!\1!p; }' file

for searching NOK

$ awk -F"[()<>]" '/ OK/ {print $(NF-1)}' urfile
test121@abc.com
test127@abc.com

$ awk -F"[()<>]" '/ NOK/ {print $(NF-1)}' urfile
test123@abc.com
test124@abc.com
test125@abc.com
test126@abc.com
test128@abc.com

hi rdcwayx,

i tried your solution. but its showing all the lines which contain NOK, i would need only email address part.

$ less NOK
2008-06-17 15:32 delivery 12473185: failure: NOK:_<test123@abc.com>/Thanks/
2008-06-17 15:32 delivery 12473115: success: OK:_<test121@abc.com>/Thanks/
2008-06-17 15:32 delivery 12473125: failure: NOK:_<test124@abc.com>/Thanks/
2008-06-17 15:32 delivery 12473135: failure: NOK:_<test125@abc.com>/Thanks/
2008-06-17 15:32 delivery 12473145: failure: NOK:_(test126@abc.com)/Thanks/
2008-06-17 15:32 delivery 12473155: success: OK:_<test127@abc.com>/Thanks/
2008-06-17 15:32 delivery 12473165: failure: NOK:_<test128@abc.com>/Thanks/
$ awk -F"[()<>]" '/ NOK/ {print $(NF-1)}' NOK
2008-06-17 15:32 delivery 12473185: failure: NOK:_<test123@abc.com>/Thanks/
2008-06-17 15:32 delivery 12473125: failure: NOK:_<test124@abc.com>/Thanks/
2008-06-17 15:32 delivery 12473135: failure: NOK:_<test125@abc.com>/Thanks/
2008-06-17 15:32 delivery 12473145: failure: NOK:_(test126@abc.com)/Thanks/
2008-06-17 15:32 delivery 12473165: failure: NOK:_<test128@abc.com>/Thanks/

can you please re-check it...

thanks in advance

if on Solaris, use either /bin/nawk or /usr/xpg4/bin/awk instead of awk

vgersh99 & rdcwayx,

thank u very much :slight_smile:

From your post you seem to want both OK and NOK: -

nawk -F"[()<>]" '/ OK| NOK/ {print $(NF-1)}' infile