在 Awk 中使用 shell 变量

在 Awk 中使用 shell 变量

我有这个:

if [[ $1 = "-c" ]] && [[ $2 =~ ^[a-z A-Z]+$ ]]
then
awk -v var="$2" '{print $2}' something.txt
fi

我想要的是使用一个命令来-c abc显示something.txt中包含的行abc

答案1

使用 grep:

grep abc something.txt

另请注意,$2指的是第二个参数(正如你似乎知道的那样),但awk它是不同的。你的问题似乎表明了对此的误解,所以我会澄清它。

shell 需要 来$引用变量的值。所以你引用一个myvar通过写作命名的变量$myvar

awk引用一个名为的变量,myvar您只需使用它的名称 - myvar。要引用包含字母 myvar 的文字字符串,请键入"myvar"

in$awk场地具有特定的数字。 so$2指的是文件当前行的第二个字段。或者如果您设置myvar = "4", then$myvar指的是第四文件的字段。

如果只是打印文件中与给定模式匹配的所有行,请使用grep— 这就是它的设计目的。

答案2

作为免责声明,awk 不是完成这项工作的正确工具 - 我假设您的实际用例更加复杂和合理,所以感谢您提炼它!

这个具体问题看起来可以归结为两件事,变量“扩展”和将参数从 bash 传递到 awk。

awk 变量和$

一旦你给 awk 变量加上前缀$,它会立即使其成为对字段的引用:如果你习惯了 shell、php 或 perl,这会很奇怪。

所以像这样的输入

thing alive
cat yes
lamp no

通过管道awk 'BEGIN{alive=2}{print $alive}'将产生

alive
yes
no

awk 'BEGIN{alive=2}{print alive}'会产生

2
2
2

当 awk 与 bash 混合使用时,事情会变得有点奇怪;希望这对第一部分有所帮助。

将参数从 bash 传递到 awk

如果您决定使用 awk,并在 bash 命令中设置 awk 变量,您可能正在寻找以下内容:

if [[ $1 = "-c" ]] && [[ $2 =~ ^[a-z A-Z]+$ ]]
then
    awk -v var="$2" 'index($0, var)' something.txt
fi

注意:theindex($0, var)是缩写if (index($0, var)) { print $0 }


诚然,这不是一个“漂亮”的解决方案,但这又回到了 awk 是不适合这项工作的工具的问题。如需完整的 awk 解决方案,请查看ARGVARGC

相关内容