2012-04-18 43 views
2

我目前遇到awk使用shell变量的问题。这里是我的问题, 当我运行以下命令:awk中的shell变量用法

的awk -F: '$ 1 == “马可”{打印$ 7}'/ etc/passwd文件

一切工作正常,很正常。但是,我希望能够通过我的$ user shell变量而不是“marco”,所以我尝试以下内容(在阅读关于-v标志后):

awk -F:-v awkvar = $ user '$ 1 =='$ awkvar“{print $ 7}”/ etc/passwd

而且它似乎不起作用。谁能帮我?

谢谢!

回答

3

在shell一侧使用引号,并且不要使用$作为awk变量。

awk -F: -v awkvar="$user" '$1==awkvar {print $7}' /etc/passwd 

awk$表示它是一个位置参数(即,场数),因此,因为它是,它一直在寻找字段“马可”,它降低到$0,整条生产线。所以它会找到只有一个字段的任何行。

+0

好的答案,我不知道字符串作为字段名减少到0. – bonsaiviking 2012-04-18 17:54:39

+0

非常感谢!这工作:) – 2012-04-18 17:55:29

2

几件事:

  1. 在AWK,可变取代而不$印记。 $表示“位置上的字段”,因此$awkvar表示“位置上的字段”值为awkvar“。如果awkvar=marco,则$awkvar$"marco"相同,相当于$ 0。
  2. 与shell变量,你无法引用变量AWK,否则他们将被视为字符串:

    sh$ awk -v awkvar=foo 'BEGIN{print "awkvar",awkvar}' 
    awkvar foo 
    sh$ 
    
  3. 包含用户名的标准shell变量是$USER,不$user

所以在最后,你要的是这样的:

awk -F: -v awkvar=$user '$1==awkvar {print $7}' /etc/passwd 

或者,使用getent

getent passwd $USER | awk -F: '{print $7}' 
+2

引用shell变量来防止空白(虽然你不希望用户名)。这引出了另一点。Marco可能使用'$ user'来保存来自用户输入或其他来源的用户名,而不是使用'$ USER'环境变量。这可以避免名称冲突。如果数据可能来自“不可信”来源,则可能包含任何内容。 – 2012-04-18 21:30:00

0

这不是一个awk而是一个壳问题。

这个可以工作(如果在您的shell环境中设置了$user变量)。

awk -F: '$1=="'"$user"'" {print $7}' /etc/passwd 
+0

'-v awkvar = $ user'表示他正试图设置和使用awk变量,所以它确实是一个awk问题,而不是一个shell。但是你的解决方案最终会产生正确的输出,所以我决定解除我的失望。 – Kevin 2012-04-18 18:16:41

+0

你应该使用'-v'而不是使用嵌套引用。 – 2012-04-18 21:24:24