Bash: Pass Shell Variables To awk

by on April 19, 2011 · 5 comments· LAST UPDATED April 19, 2011

in

How do I pass shell variables to awk command or script under UNIX like operating systems?

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 root value - " r}'
 

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

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
TwitterFacebookGoogle+PDF versionFound an error/typo on this page? Help us!

{ 5 comments… read them below or add one }

1 David May 18, 2012 at 8:22 pm

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

Reply

2 James Kernaghan January 10, 2013 at 3:28 pm

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!

Reply

3 Goal Lin January 17, 2013 at 8:06 am

I suggest you do this using three loops, each for rpc, err and warn

Reply

4 David May 18, 2012 at 8:24 pm

Works well once you have the format

Reply

5 prats September 25, 2013 at 10:31 am

Thanks -v works :)

Reply

Leave a Comment

Tagged as: , , , , , , , ,

Previous Faq:

Next Faq: