Question

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

Was it helpful?

Solution 2

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

OTHER TIPS

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

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

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"  }'
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top