I have csvde dump from active directory I process on my postfix mta. It takes output like this:
"CN=Curtis xxx,OU=Domain Users,OU=xxx xxx,DC=xxx-xxx,DC=local",X400:c=US;a= ;p=xxx xxx xxx;o=Exchange;s=xxx;g=xxx;;SMTP:Cxxx@xxx-xxx.com
and should return a relay_recipient map in the form of: Cxxx@xxx-xxx.com OK
The command I am using is: cat $1 | tr -d " | tr , \n| tr ; \n | awk -F: '/(SMTP|smtp):/ {printf("%s\tOK\n",$2)}'
Everything up to the awk is working, it drops the smtp: but its putting OK's all over the darn place. Anyone familiar enough with awk and printf that can suggest why this happens?
Thanks! jlc
On Mon, Jun 23, 2008 at 11:25:45AM -0600, Joseph L. Casale wrote:
I have csvde dump from active directory I process on my postfix mta. It takes output like this:
"CN=Curtis xxx,OU=Domain Users,OU=xxx xxx,DC=xxx-xxx,DC=local",X400:c=US;a= ;p=xxx xxx xxx;o=Exchange;s=xxx;g=xxx;;SMTP:Cxxx@xxx-xxx.com
and should return a relay_recipient map in the form of: Cxxx@xxx-xxx.com OK
The command I am using is: cat $1 | tr -d " | tr , \n| tr ; \n | awk -F: '/(SMTP|smtp):/ {printf("%s\tOK\n",$2)}'
Use sed instead: sed -n 's/^.*;;SMTP:(.*)$/\1 OK/p' < $1
Everything up to the awk is working, it drops the smtp: but its putting OK's all over the darn place. Anyone familiar enough with awk and printf that can suggest why this happens?
It works OK on the test line you provided; my guess is your datafile has other lines that match "SMTP" in other fields of the source.
It works OK on the test line you provided; my guess is your datafile has other lines that match "SMTP" in other fields of the source.
Yeah when I echo'ed a single email into it everything was fine, but the file wasn't. I looked at it in vi and saw all the dos carriage returns so added a tr -d '\r' before the awk.
I will check out the sed statement, thanks! jlc
I have csvde dump from active directory I process on my postfix mta. It takes output like this: "CN=Curtis xxx,OU=Domain Users,OU=xxx xxx,DC=xxx-xxx,DC=local",X400:c=US;a= ;p=xxx xxx xxx;o=Exchange;s=xxx;g=xxx;;SMTP:Cxxx@xxx-xxx.com and should return a relay_recipient map in the form of: Cxxx@xxx-xxx.com OK Everything up to the awk is working, it drops the smtp: but its putting OK's all over the darn place. Anyone familiar enough with awk and printf that can suggest why this happens?
you can simplify that line down to:
awk 'BEGIN { FS=":" } /(smtp|SMTP)/ { printf "%-30sOK\n", $NF }' $1
the -30 will make sure that everything aligns, because with just a tab to separate the email addresses, you'll end up with a wonky OK column. -30 pads out the first column to 30 characters.
also, I recommend changing the /(smtp|SMTP)/ to just /SMTP/ because if a program is producing output like this from AD or LDAP, then the SMTP will always be caps. You risk matching other lines in the log file that don't match this format.
basically, this script separates a line by colons ':' and prints the last field if the line fed to it contains 'smtp' or 'SMTP'. The $NF is Number of Fields, so effectively prints the last field.
you can simplify that line down to:
awk 'BEGIN { FS=":" } /(smtp|SMTP)/ { printf "%-30sOK\n", $NF }' $1
the -30 will make sure that everything aligns, because with just a tab to separate the email addresses, you'll end up with a wonky OK column. -30 pads out the first column to 30 characters.
also, I recommend changing the /(smtp|SMTP)/ to just /SMTP/ because if a program is producing output like this from AD or LDAP, then the SMTP will always be caps. You risk matching other lines in the log file that don't match this format.
basically, this script separates a line by colons ':' and prints the last field if the line fed to it contains 'smtp' or 'SMTP'. The $NF is Number of Fields, so effectively prints the last field.
Well, the theory behind the case insensitivity is for users with more that one email address. The primary is always caps, but secondary's are lower case.
Thanks for the pointer! jlc