Date: Fri, 15 Sep 2017 14:47:47 +0200 From: Polytropon <freebsd@edvax.de> To: Ernie Luzar <luzar722@gmail.com> Cc: "freebsd-questions@freebsd.org" <freebsd-questions@freebsd.org> Subject: Re: Help scripting dns lookup using awk Message-ID: <20170915144747.5dc31f69.freebsd@edvax.de> In-Reply-To: <59BB24E4.6060908@gmail.com> References: <59BB24E4.6060908@gmail.com>
next in thread | previous in thread | raw e-mail | index | archive | help
On Thu, 14 Sep 2017 20:55:00 -0400, Ernie Luzar wrote:
> host_in="$1"
> host_out="$2"
> host_error="$3"
> truncate -s 0 $host_out
> truncate -s 0 $host_error
>
> cat $host_in | awk '
> { system(host $1)
> rc_status = system($0)
> if (rc_status != 0)
> print $1 > $host_error
> else
> print $1 > $host_out
> }'
>
>
> # command line exec command.
> >hosts2void-dns_lookup.awk /tmp/aw.hosts \
> /root/good.dns /root/bad.dns
>
> # This is the output.
> sh: medrx.sensis.com.au: not found
> sh: medrx.sensis.com.au: not found
You're not providing the whole command as needed; system($0) will
only try to execute the hostname, not a "host <something>" command.
> awk: illegal field $(), name "host_error"
> input record number 1, file
> source line number 5
The $ is a reserved character in awk to indicate the fields; $0 is
the whole record, $1 the first field, and so on.
> I see 2 problems with my awk code.
>
> 1. The text output of the host command results is going
> the console screen. In the sh version I kill the output
> using > /dev/null How would I to do something like that in awk.
Combine the command string before executing, for example like this:
cmd = sprintf("/usr/bin/host %s > /dev/null 2>&1", $1)
rc = system(cmd)
This should suppress all messages, and you can still evaluate the
return code of the external program call.
> 2. I get that doing print $1 > $host_error is not allowed.
> What is the correct way to pass script variables to awk?
Look closely: Your awk script is in ' ... ' (single quotes). According
to standard sh behavior, this means that $<something> is not expanded
(unlike " ... $<something> ..."). If you want to transfer parameters
into an awk script from a sh "enclosure", use awk's -v parameter.
For example:
... | awk -v host_out=${host_out} -v host_error=${host_error} '
# your awk code here
'
> Now I am wondering if there is a simpler way to do dns lookup
> in awk?
Just tidy up your code a little bit, the basic parts are already
there. ;-)
--
Polytropon
Magdeburg, Germany
Happy FreeBSD user since 4.0
Andra moi ennepe, Mousa, ...
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20170915144747.5dc31f69.freebsd>
