2

我目前在 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

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

谢谢!

4

3 回答 3

3

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

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

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

于 2012-04-18T17:46:46.790 回答
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}'
于 2012-04-18T17:53:26.953 回答
0

这不是awk一个壳问题。

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

awk -F: '$1=="'"$user"'" {print $7}' /etc/passwd
于 2012-04-18T18:03:42.627 回答