awk中的shell变量用法

时间:2012-04-18 17:40:42

标签: bash shell awk

我目前遇到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

它似乎不起作用。任何人都可以帮助我吗?

谢谢!

3 个答案:

答案 0 :(得分:3)

在shell端使用引号,不要将$用于awk变量。

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

awk中,$表示它是位置参数(即字段编号),因此它正在寻找字段“marco”,其缩小为$0 ,整条线。所以它会找到只有一个字段的任何行。

答案 1 :(得分:2)

一些事情:

  1. 在awk中,变量被替换而没有$ sigil。 $表示“位置上的字段”,因此$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

  4. 总而言之,你想要的是:

    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