【问题标题】:shell variable usage in awkawk 中的 shell 变量使用
【发布时间】:2012-04-18 17:40:42
【问题描述】:

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

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

谢谢!

【问题讨论】:

    标签: bash shell awk


    【解决方案1】:

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

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

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

    【讨论】:

    • 好答案,我不知道作为字段名的字符串会减少到0。
    【解决方案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}'
    

    【讨论】:

    • 引用 shell 变量以防止出现空格会更安全(尽管您不希望在用户名中出现这种情况)。这就引出了另一点。也许 Marco 使用$user 来保存来自用户输入或其他来源的用户名,而不是使用$USER 环境变量。这样可以避免名称冲突。如果数据可能来自“不受信任”的来源,则它可能包含任何内容。
    【解决方案3】:

    不是awk,而是shell问题。

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

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

    【讨论】:

    • -v awkvar=$user 表示他试图设置和使用 awk 变量,所以这确实是一个 awk 问题,而不是 shell 问题。但是您的解决方案最终确实产生了正确的输出,所以我决定撤消我的反对票。
    • 你应该使用-v而不是使用嵌套引用。
    猜你喜欢
    • 2014-01-20
    • 1970-01-01
    • 1970-01-01
    • 2015-08-16
    • 1970-01-01
    • 1970-01-01
    • 2014-01-04
    • 1970-01-01
    • 2022-01-18
    相关资源
    最近更新 更多