Awk 脚本中的 Bash 变量

Awk 脚本中的 Bash 变量

我有这个平面文件数据库(ff_servers.db),其中包含以下内容:

192.168.154.2 Alaska   hp
192.168.157.3 Colorado dell
192.168.156.3 hawaii   hp

从命令行,我可以运行:

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

我会得到

hp

但是,在 bash 脚本中,我遇到了“$NF”问题,这是该脚本的转储:

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'

显然,$NF 没有被正确翻译。我哪里做错了?

答案1

$Bash 扩展双引号内的变量(例如以 开头的标识符) "

尽管从命令行以交互方式执行此操作时这也应该是一个问题。 Bash 将尝试 Expand ,如果未定义"$NF"变量,则 bash 会将其扩展为空字符串。NF

通常你可以使用单引号,'这样$NFbash就不会扩展它。

不过既然你想${server_name}扩展,你可以尝试双重转义

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

您也可以尝试使用字符串连接,区别主要在于风格上。

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

这是因为 bash 会将相邻的字符串连接在一起。

相关内容