Bash Pass Shell Variables To Awk Script

last updated in Categories , , , , , , ,

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.

Bash Pass Shell Variables To Awk Using -v Option

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}'

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

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}'
Bash Pass Shell Variables To Awk Script On Linux and Unix
Passing command line shell variables to awk on Linux and Unix-like systems

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"

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}'

Passing Command Line Variables to awk on Linux
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"

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"]}'

How can I use shell variable in side with awk

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

How to Allow Awk to Use Shell Variables

Setup shell variables using awk

You can use eval command as follows:

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

Sample outputs:

Bus

See also:

  1. How To Use awk In Bash Scripting

Posted by: Vivek Gite

The author is the creator of nixCraft and a seasoned sysadmin, DevOps engineer, and a trainer for the Linux operating system/Unix shell scripting. Get the latest tutorials on SysAdmin, Linux/Unix and open source topics via RSS/XML feed or weekly email newsletter.

Start the discussion at www.nixcraft.com

Historical Comment Archive

8 comment

  1. You can pass a varable directly if delimited properly. For example:

    LINE="/thishost/homedir/john-doe/.sh_history"
      total_fields=`echo "$LINE" | awk -F/ '{print NF}'`
      history_file=`echo "$LINE" | awk -F/ '{print $NF}'`
      # Example to pass a variable in awk
      num_fields=`expr $total_fields - 1`
      user_dir=`echo $LINE |awk -F/ '{print $'''$num_fields'''}'`
      echo "$user_dir"
    
    

    Edited by Admin – added formatting to the code

    1. This has been breaking my heart for 12 hours – thank you! I was simply trying to run commands through iteration of a char-delimited text line, so was trying to figure out how to substitute in the position parameter, via a while loop:

      ix=1; while [ $ix -le `echo rpc,err,warn | awk -F, ‘{print NF}’` ]; do echo Huzzah `echo rpc,err,warn | awk -F”,” ‘{ print $”’$ix”’ }’`; ix=`expr $ix + 1`; done

      In that case: rpc,err,warn is an example of the string I’m trying to iterate against; I’ll ultimately grep each word from a file.

      Can you explain what allows the triple ”’$num_fields”’ to substitute a foreign var in for the position param?

      Thanks a million!

    Still, have a question? Get help on our forum!