我有这个:
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 解决方案,请查看ARGV
和ARGC