Use a shell variable in awk
You seem to be confusing awk variables and shell variables. awk -v vawk="$1"
creates an awk variable called vawk
, yet you are trying to use shell syntax ($vawk
). This doesn't work because the shell doesn't have a variable called vawk
. I think what you want is
awk -v vawk="$1" '$0 ~ vawk { c++ } # ...'
# ^ awk variable syntax
Reproduced from this now closed as duplicate question as it includes warnings on the limitations of awk variable passing which one might find useful.
A shell variable is just that: a shell variable. If you want to turn it into a awk variable, you need a syntax such as:
awk -v x="$x" '$2 == x {print $1}' infile
or
awk '$2 == x {print $1}' x="$x" infile
However, those suffer from a problem: escape sequences are expanded in them (and with GNU awk
4.2 or above, if $x
starts with @/
and ends in /
, it's treated as a regexp type of variable).
So, for instance if the shell variable contains the two characters backslash and n, the awk variable will end up containing the newline character (and with gawk 4.2+, if it contains @/foo/
, the awk variable will contain foo
and be of type regexp
).
Another approach (but which like for -v
requires a POSIX awk or nawk (as opposed to the 1970's awk still found as /bin/awk
in Solaris)) is to use environment variables:
x="$x" awk '$2 == ENVIRON["x"] {print $1}' infile
Another approach (still with newer awks) is to use the ARGV array in awk:
awk 'BEGIN {x = ARGV[1]; delete ARGV[1]}
$2 == x {print $1}' "$x" infile