Bash Pass Shell Variables To Awk Script

ADVERTISEMENTS



Bash Pass Shell Variables To Awk Using -v Option

How do I pass shell variables to awk command or script under Linux or UNIX-like operating systems? How do I use shell variables in an awk script? How can I allow awk to use shell variables?There are two ways for passing command-line shell variables to an awk script. This page explains how to get shell variables into awk using various methods.

The -v option can be used to pass shell variables to awk command. Consider the following simple example:

root = "/webroot" echo | awk -v r = $root '{ print "shell variable $root value is " r}' root="/webroot" echo | awk -v r=$root '{ print "shell variable $root value is " r}'

It works with various version of awk running on Linux, *BSD, macOS, and Unix-like systems.

How do I use shell variables in an awk script?

The variable is available in the BEGIN block as well. For example:

a = 5 awk -v var = $a 'BEGIN{ ans=var*2} { print ans}' <<</ dev / null a=5 awk -v var=$a 'BEGIN{ ans=var*2} { print ans}'<<</dev/null

How to pass multiple shell variables to awk

The syntax is as follows for passing multiple -v to the awk:

x = 10 y = 30 text = "Total is : " awk -v a = $x -v b = $y -v c = " $text " 'BEGIN {ans=a+b; print c " " ans}' x=10 y=30 text="Total is : " awk -v a=$x -v b=$y -v c="$text" 'BEGIN {ans=a+b; print c " " ans}'

AWK and command substitution

Command substitution means nothing more but to run a shell command and store its output to a variable or display back using echo command. For example, display date and time using a shell variable:

today =$ ( date ) echo " $today " today=$(date) echo "$today"

One can allow awk to use shell variables created with command substitution as follows:

## bash ## awk -v today = " $(date) " 'BEGIN {print today}' ## more portable ## awk -v today = " `date` " 'BEGIN {print "Today is " today}' ## bash ## awk -v today="$(date)" 'BEGIN {print today}' ## more portable ## awk -v today="`date`" 'BEGIN {print "Today is " today}'



In this example search file using awk as follows:

#!/bin/bash # Usage : Search word using awk for given file. # Syntax: ./script "word-to-search" fileToSearch s = $1 i = $2 awk -v search = " $s " '$0 ~ search' " $i " #!/bin/bash # Usage : Search word using awk for given file. # Syntax: ./script "word-to-search" fileToSearch s=$1 i=$2 awk -v search="$s" '$0 ~ search' "$i"

Save and close the file. Run it as follows:

$ ./script.sh "vivek" /etc/passwd

Sample outputs:

vivek:x:1000:1000:Vivek Gite,,,:/home/vivek:/bin/bash

How to access shell environment variables in awk using ENVIRON

You need to use ENVIRON shell variable. From the gnu/awk man page:

An array containing the values of the current environment. The array is indexed by the environment variables, each element being the value of that variable (e.g., ENVIRON[“HOME”] might be “/home/arnold”). Changing this array does not affect the environment seen by programs which gawk spawns via redirection or the system() function.

For example, print $BASH and $USER shell variables using awk:

echo " $BASH " echo " $USER " echo " $HOME " export demo = "Om nom nom" awk 'BEGIN{print ENVIRON["HOME"]}' awk 'BEGIN{print ENVIRON["demo"]}' var = "value" awk 'BEGIN{print ENVIRON["var"]}' awk 'BEGIN{print "Hello, "ENVIRON["USER"], "! Home dir " ENVIRON["HOME"]}' echo "$BASH" echo "$USER" echo "$HOME" export demo="Om nom nom" awk 'BEGIN{print ENVIRON["HOME"]}' awk 'BEGIN{print ENVIRON["demo"]}' var="value" awk 'BEGIN{print ENVIRON["var"]}' awk 'BEGIN{print "Hello, "ENVIRON["USER"], "! Home dir " ENVIRON["HOME"]}'

A note about ARGV

ARGV is array of command line arguments passed to the awk. The array is indexed from 0 to ARGC – 1. Dynamically changing the contents of ARGV can control the files used for data. Let us see how to use ARGV with awk and shell variables:

awk 'BEGIN {print ARGV[0]}' os = "Linux" awk 'BEGIN {print ARGV[1]}' " $os " a = 10 b = 20 awk 'BEGIN {print ARGV[1] " " ARGV[2]}' $a $b awk 'BEGIN {total=ARGV[1] + ARGV[2]; print total}' $a $b awk 'BEGIN {print ARGV[0]}' os="Linux" awk 'BEGIN {print ARGV[1]}' "$os" a=10 b=20 awk 'BEGIN {print ARGV[1] " " ARGV[2]}' $a $b awk 'BEGIN {total=ARGV[1] + ARGV[2]; print total}' $a $b

Setup shell variables using awk

You can use eval command as follows:

eval $ ( awk 'BEGIN{ print "vech=Bus"}' < / dev / null ) echo $vech eval $(awk 'BEGIN{ print "vech=Bus"}' < /dev/null) echo $vech

Sample outputs:

Bus

See also: