2

I have this flat file database(ff_servers.db) with following contents:

192.168.154.2 Alaska   hp
192.168.157.3 Colorado dell
192.168.156.3 hawaii   hp

From command line, I could run:

awk "BEGIN{IGNORECASE=1;}/alaska/ {print $NF}" ff_servers.db`

and I would get

hp

However, from a bash script, I'm having problems with "$NF" Here's the dump of that script:

machine_type=`awk "BEGIN{IGNORECASE=1;}/${server_name}/ {print \$NF}" ff_servers.db`
awk "BEGIN{IGNORECASE=1;}/${server_name}/ {print $NF}" ff_servers.db
++ awk 'BEGIN{IGNORECASE=1;}/colorado/ {print }' ff_servers.db
+ target_arch='192.168.157.3   Colorado           dell'

So obviously, $NF is not being translated properly. Where am I doing wrong?

1
  • Use the standard "$()" format to ensure more conventional quoting behaviour.
    – orion
    Feb 12, 2015 at 18:40

1 Answer 1

3

Bash expands variables (such as identifiers beginning with $) within double quotes ".

Although this should have also been a problem when doing this interactively from the commmand line. Bash will try expand "$NF", if the variable NF isn't defined then bash will expand this to the empty string.

Usually you can use single quotes ' so that $NF will not be expanded by bash.

However since you want ${server_name} to expand, you can try double escaping

machine_type=`awk "BEGIN{IGNORECASE=1;}/${server_name}/ {print \\$NF}" ff_servers.db`

You could also try using string concatenation, the difference is mostly stylistic.

machine_type=`awk 'BEGIN{IGNORECASE=1;}/'${server_name}'/{print $NF}' ff_servers.db`

This works as bash will concatenate adjacent strings together.

7
  • thanks for the help. I figured out the answer myself as I was fiddling with my script. As I had the need for $server_name to be a variable, I had this instead: machine_type=awk 'BEGIN{IGNORECASE=1;}/'${server_name}'/ {print $NF}' ff_servers.db` `coz if I would leave it as you suggested, $server_name would then be interpreted not as a variable but a constant with $ sign.
    – icasimpan
    Dec 27, 2012 at 7:44
  • I was just in the process of writing about string concatenation as a possible solution :)
    – cjh
    Dec 27, 2012 at 7:48
  • 2
    I prefer to not mess up the code with escaping: machine_type=$(awk -vserver_name="$server_name" 'BEGIN{IGNORECASE=1}$0~server_name{print $NF}' ff_servers.db).
    – manatwork
    Dec 27, 2012 at 7:51
  • @manatwork, can you clarify your solution please? I can't seem to make it work. Maybe on a separate answer instead of a comment as it breaks some statements
    – icasimpan
    Dec 27, 2012 at 8:06
  • 1
    See here: pastebin.com/LPsLG4xz What kind of awk you use?
    – manatwork
    Dec 27, 2012 at 8:17

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .