在 awk substr 函数中使用变量

在 awk substr 函数中使用变量

大家好,我有一个字符串,我想从中提取一个子字符串。问题是起始位置存储在变量中。AWK 似乎无法识别该变量。

以下是代码

str="This is a test"  
s1="is"  
i=$(awk -v a="$str" -v b="$s1" 'BEGIN{print index(a,b)}')  
echo "$str" | awk '{print substr($0,$i)}'

但这不起作用。如何强制 awk 识别i

答案1

狂欢

awk -v value="$i" '{print substr($0,value)}' <<< "$str"

答案2

变量未被传递到awk。而是

echo "$str" | awk '{print substr($0,$i)}'

echo $str | awk -v i="$i" '{print substr($0,i)}'

然而,输出是

% ./a.sh
is is a test

您的预期输出是什么?

答案3

为什么不在一次 awk 调用中完成所有处理?

haystack="This is a test"
needle="is"
printf '%s\n' "$haystack" | awk -v "needle=$needle" '{
    i=index($0, needle)
    if (i) print substr($0, i)
}'

如果您需要您的 shell 脚本也看到 的值i,您可以> "/dev/tty"在上面的命令末尾添加print,然后添加另一行仅仅print i没有重定向,然后将整printf ... | awk ...行包装在一个i=$(...)构造中。

答案4

直接回答原始问题:通过转义引号并让 shell 扩展变量:

awk '{print substr($0,'$i')}'

如果怀疑变量可能包含空格和其他内容,并且希望在 awk 中将其视为字符串,则可以使用更多引号:

awk '{print index($0,"'"$s1"'")}'

...但如果遇到这种情况,人们往往会做一些不太理想的事情:-)。

相关内容