Does awk -v accept command substitution?

782 views Asked by At

Can I create an awk variable in a one liner using bash command substitution techniques? Here is what I am trying, but something is not right.

awk -v AVG=$(uptime|awk '{print $(NF-2)}') '{ if ( AVG >= 1 ) print "there is a load"  }'

Perhaps it's because the command substitution uses Awk (though I doubt it)? Maybe that's too "Inception-ish"? GNU Awk 3.1.7

4

There are 4 answers

0
Mano Nadar On BEST ANSWER

There is nothing wrong with your command. Your command is waiting for an input and that's the only reason why it doesn't get executed!

For instance:

$ awk -v AVG=$(uptime|awk '{print $(NF-2)}') '{ if ( AVG >= 0 ) print "there is a load"  }'
abc                 ## I typed.
there is a load     ## Output.

Just include BEGIN in your command as suggested by the experts!

$ awk -v AVG=$(uptime|awk '{print $(NF-2)}') 'BEGIN{ if ( AVG >= 0 ) print "there is a load"  }'
there is a load
0
Håkon Hægland On

Since the last awk command does not have an input file, you can only use a BEGIN clause for that script. So you can try the following:

awk -v AVG=$(uptime|awk '{print $(NF-2)}') 'BEGIN{ if ( AVG >= 1 ) print "there is a load"  }'
1
Dmitry Alexandrov On

Why use a variable here at all? So far as AWK reads stdin unless you explicitly specify the opposite, that should be a preferable way:

$ uptime | awk '$(NF-2) >= 1 { print "there is a load" }'
there is a load
0
Ed Morton On

This:

awk -v AVG=$(uptime|awk '{print $(NF-2)}') '{ if ( AVG >= 1 ) print "there is a load"  }'

needs a BEGIN as others have stated:

awk -v AVG=$(uptime|awk '{print $(NF-2)}') 'BEGIN{ if ( AVG >= 1 ) print "there is a load"  }'

but also, you don't need to call awk twice as that can be written as:

awk -v uptime=$(uptime) 'BEGIN{ n=split(uptime,u); AVG=u[n-2]; if ( AVG >= 1 ) print "there is a load"  }'

or more likely what you want:

uptime | awk '{ AVG=$(NF-2); if ( AVG >= 1 ) print "there is a load"  }'

which can be reduced to:

uptime | awk '$(NF-2) >= 1 { print "there is a load"  }'