this is first line
this is second line
this is my string on the third line
this is fourth line
the end
现在,当我在命令提示符处直接使用此命令时:
% awk ‘s=index($0, “my string”) { print “line=” NR, “position= ” s}’ myFile
我得到了我想要的结果:
% line= 3, position= 9
我的问题是:如果我定义一个变量VAR =“my string”,为什么我这样做时不能得到相同的结果:
% awk ‘s=index($0, $VAR) { print “line=” NR, “position= ” s}’ myFile
它不会起作用!!我甚至尝试将$ VAR放在引号中,但没有用?我尝试使用VAR(没有$符号),没有运气。我尝试了一切我能想到的......我错过了什么吗?
答案 0 :(得分:3)
awk
变量与shell变量不同。您需要使用-v
标志
例如:
$ awk -v var="..." '$0~var{print NR}' file
将打印模式匹配的行号。或者对于索引
的情况$ awk -v var="$Var" 'p=index($0,var){print NR,p}' file
使用全部大写可能不是很好的约定,因为您可能会意外覆盖其他变量。
将输出捕获到shell变量
$ info=$(awk ...)
对于shell数组的多行输出分配,你可以做
$ values=( $(awk ...) ); echo ${values[0]}
但是,如果输出包含多个字段,则会为其分配自己的数组索引。您可以通过设置IFS
变量来更改它,例如
$ IFS=$(echo -en "\n\b"); values=( $(awk ...) )
将捕获完整的行作为数组值。