Awk, shell variables

Hello, I've been trying to figure out how to use variables inside the AWK command and use it back in the korn shell sript.

in my script I have lots of awk commands like this

grep Listen /etc/ssh/sshd_config | \
awk '{ if ($2 == "22" ) print "OK";
else print "not OK"
}'

I need to add a counter to count how many issues/problems I have, something like

x=0

grep Listen /etc/ssh/sshd_config | \
awk '{ if ($2 == "22" )
print "OK";
else
print "not OK"
x++
}'

# ... more of awk commands ...

echo x;

unfortunatelly x "inside" the awk command is different/local to awk command ... is there a way to do thi/

Thank you,
K.

Hi,

you can pass variables to awk via the "-v"-option. See "man awk".

awk -v x=$x '{print x }' file

To use the awk output in a shell-variable something like:

x=$(awk ... )

works.

HTH Chris

Chris,
awk -v x=$x ... works great and I'm able to pass the value into awk, now I just need to export it back to the script ...
I can't use
x=$(awk ... ) 'cause my command uses also print command and the counter, is there a way how to export the variable from within the AWK command?

thank you,
K.

The simple answer is no. The awk script is running as a subshell and there's no way to make a child process alter the environment of its parent.

Having said that, the awk process can create a file (say, /tmp/awk.env) with the content

where <x> is the new value. In your parent script, you then source the env file i.e.

NOTE: By having the "export" in env file, it's not necessary to pass $X into the next awk call as it's now available in the parent's environment.

HTH

Jerry