Is it possible to pass shell variable settings into an awk program?

Is it possible to pass shell variable settings into an awk program?

There are two different ways to do this. The first involves
simply expanding the variable where it is needed in the program.
For example, to get a list of all ttys you're using:

who | awk '/^'"$USER"'/ { print $2 }' (1)

Single quotes are usually used to enclose awk programs because
the character '$' is often used in them, and '$' will be
interpreted by the shell if enclosed inside double quotes, but
not if enclosed inside single quotes. In this case, we *want*
the '$' in "$USER" to be interpreted by the shell, so we close
the single quotes and then put the "$USER" inside double quotes.
Note that there are no spaces in any of that, so the shell will
see it all as one argument. Note, further, that the double
quotes probably aren't necessary in this particular case (i.e. we
could have done

who | awk '/^'$USER'/ { print $2 }' (2)

), but they should be included nevertheless because they are
necessary when the shell variable in question contains special
characters or spaces.

The second way to pass variable settings into awk is to use an
often undocumented feature of awk which allows variable settings
to be specified as "fake file names" on the command line. For
example:

who | awk '$1 == user { print $2 }' user="$USER" - (3)

Variable settings take effect when they are encountered on the
command line, so, for example, you could instruct awk on how to
behave for different files using this technique. For example:

awk '{ program that depends on s }' s=1 file1 s=0 file2 (4)

Note that some versions of awk will cause variable settings
encountered before any real filenames to take effect before the
BEGIN block is executed, but some won't so neither way should be
relied upon.

Note, further, that when you specify a variable setting, awk
won't automatically read from stdin if no real files are
specified, so you need to add a "-" argument to the end of your
command, as I did at (3) above.

A third option is to use a newer version of awk (nawk), which allows
direct access to environment vairables. Eg.

nawk 'END { print "Your path variable is " ENVIRON["PATH"] }' /dev/null



Home FAQ