如何在unix shell脚本

时间:2015-12-22 18:48:58

标签: bash shell unix awk

你能帮我解决这个难题吗?我试图在文件中打印字符串(即行#)的位置,首先打印到std输出,然后在变量中捕获该值以便稍后使用。字符串是“my string”,文件名是“myFile”,定义如下:

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(没有$符号),没有运气。我尝试了一切我能想到的......我错过了什么吗?

1 个答案:

答案 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 ...) )

将捕获完整的行作为数组值。