我目前遇到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
它似乎不起作用。任何人都可以帮助我吗?
谢谢!
答案 0 :(得分:3)
在shell端使用引号,不要将$
用于awk变量。
awk -F: -v awkvar="$user" '$1==awkvar {print $7}' /etc/passwd
在awk
中,$
表示它是位置参数(即字段编号),因此它正在寻找字段“marco”,其缩小为$0
,整条线。所以它会找到只有一个字段的任何行。
答案 1 :(得分:2)
一些事情:
$
sigil。 $
表示“位置上的字段”,因此$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}'
答案 2 :(得分:0)
这不是awk
,而是shell问题。
这个可行(如果在shell环境中设置了$user
变量)。
awk -F: '$1=="'"$user"'" {print $7}' /etc/passwd