我目前在 awk 使用 shell 变量时遇到问题。这是我的问题,当我运行以下命令时:
awk -F: '$1=="marco" {print $7}' /etc/passwd
一切正常,花花公子。但是,我希望能够传递我的 $user shell 变量而不是“marco”,所以我尝试以下操作(在阅读了 -v 标志之后):
awk -F: -v awkvar=$user '$1=="$awkvar" {print $7}' /etc/passwd
它似乎不起作用。谁能帮我?
谢谢!
在 shell 端使用引号,不要$
用于 awk 变量。
awk -F: -v awkvar="$user" '$1==awkvar {print $7}' /etc/passwd
In awk
,$
表示它是一个位置参数(即字段编号),因此,它正在寻找字段“marco”,它简化为$0
整行。所以它会找到任何只有一个字段的行。
一些东西:
$
符号。$
表示“位置的字段”,因此$awkvar
表示“awkvar 的位置值的字段”。如果awkvar=marco
,则$awkvar
与 相同$"marco"
,相当于 $0。与 shell 变量不同,您不能引用 awk 变量,否则它们会被视为字符串:
sh$ awk -v awkvar=foo 'BEGIN{print "awkvar",awkvar}'
awkvar foo
sh$
包含用户名的标准 shell 变量是$USER
,不是$user
所以总而言之,你想要的是这样的:
awk -F: -v awkvar=$user '$1==awkvar {print $7}' /etc/passwd
或者,使用getent
:
getent passwd $USER | awk -F: '{print $7}'
这不是awk
一个壳问题。
这个可以工作(如果$user
在你的 shell 环境中设置了变量)。
awk -F: '$1=="'"$user"'" {print $7}' /etc/passwd