【问题标题】:Using double quotes in awk [duplicate]在 awk 中使用双引号 [重复]
【发布时间】:2018-04-03 13:22:26
【问题描述】:

此命令将打印a

echo "line1 a b c" | awk '{ print $2 }'

如果我将单引号更改为双引号,像这样,它将打印整行。

echo "line1 a b c" | awk "{ print $2 }"

为什么?我知道我应该使用单引号,但是为什么我使用双引号会打印整行?

【问题讨论】:

  • 使用双引号,shell 将$2 扩展为第二个位置参数,该参数很可能为空,而 awk 只看到 print
  • @BenjaminW。同意你的回答,但不要认为它是重复的。
  • 我看不出它是如何不是重复的。一个关于 bash 中单引号和双引号有何不同的答案回答了它们在使用 bash 调用 awk 时有何不同,因为唯一的区别是 shell 的行为; awk 无法分辨 awk '{ print }'awk "{ print $2 }" 之间的区别,而 bash 的 $2 为空。

标签: linux shell


【解决方案1】:

如果awk 命令是单引号,则$2 不会被shell 解释,而是作为文字字符串$2 传递给awk。然后awkprint 输入字符串中的第二个空格分隔标记,在本例中为a

echo "line1 a b c" | awk '{ print $2 }' # prints the second space-delimited token
> a

如果awk 命令是双引号,则$2 由shell 解释。因为$2 是空的(在这种情况下),空字符串被替换。 awk 看到一个类似于 awk "{ print }" 的命令,这是一个打印所有内容的指令。

echo "line1 a b c" | awk '{ print }' # prints all input
> line1 a b c

也可以使用双引号,并转义$,这将导致$不被shell解释,而是$2字符串将被传递给awk

echo "line1 a b c" | awk "{ print \$2 }" # prints the second space-delimited token
> a

【讨论】:

    猜你喜欢
    • 2017-07-09
    • 1970-01-01
    • 1970-01-01
    • 2015-07-31
    • 2016-11-08
    • 2012-10-16
    • 1970-01-01
    • 2017-04-09
    • 2012-01-06
    相关资源
    最近更新 更多