在Bash脚本中使用awk

时间:2017-03-11 03:37:57

标签: bash

我正在学习Bash脚本。 我的data.txt包含:

A Orange
B Apple

我试过了

echo "enter"
read fruit
awk -F'[: ]' '$2 == "Apple"' data.txt
a=`awk -F'[: ]' '\$2 == "$fruit"' data.txt` # returns null
echo "$a"

为什么当我使用变量' a'时,我的awk命令无效。用它?

1 个答案:

答案 0 :(得分:2)

问题的关键在于您尝试使用单引号字符串,就好像它是双引号字符串一样。

您使用时意味着做什么:

'\$2 == "$fruit"' # DOES NOT WORK - nothing is escaped or expanded

是:

"\$2 == \"$fruit\""  # keep literal $2, expand $fruit

单引号shell字符串中的任何内容都是字面意思,因此不会扩展变量引用,也不需要转义 - 也不能转义( \也将成为字符串的文字部分。)

尽管如此,最好将shell和Awk脚本的世界分开,以防止混淆,这意味着:

  • 使用单引号字符串作为Awk脚本。
  • 通过Awk' -v选项将任何shell变量值传递给脚本,以创建 Awk 变量。

如果我们把它们放在一起:

a=$(awk -F'[: ]' -v fruit="$fruit" '$2 == fruit' data.txt)

请注意,我使用了现代命令替换语法$(...),即preferable to legacy syntax `...`