awk 中 $1、${1} 和 $"1" 之间的区别

awk 中 $1、${1} 和 $"1" 之间的区别

在处理脚本时,以下脚本出现错误

file * | awk '{ ${1}=""; print substr(${0},2) }';

而以下两个脚本都成功运行

file * | awk '{ $"1"=""; print substr($"0",2) }';

file * | awk '{ $1=""; print substr($0,2) }';

不都是$1, ${1}, $"1"参数替换吗?我的awk语法有问题吗?

答案1

awk不是外壳。awk有自己的语法、句法和语义。${1}不是语法上正确的awk代码,而 和$1都是$"1"(并且它们在 中是等效的awk)。在 中awk,这些不是替换。

其中awk,$1指当前输入记录的第一个字段,$0指完整的输入记录,而在 shell 中,$1指第一个位置参数(通常是脚本或函数的命令行中的第一个参数),$0通常指当前 shell 或 shell 脚本的名称。

Shell变量和awk变量也是完全分开的。这就是为什么如果您需要将值从 shell“导入”到脚本,则awk需要使用命令行标志来设置其变量:-vawk

$ awk -v var="$var" '{...}'

您还可以为awk脚本提供 shell 变量的值,如下所示:

$ awk '{...}' var="$var"

这是几乎与使用 with 的操作相同-v,只是变量var在任何块中都将为空BEGIN。一个BEGIN块被执行查看输入数据,并设置变量这样一个块的执行。

你也可以做

$ awk '{...}' var="$value1" file1 var="$value2" file2

这使得该变量获得了刚刚被处理的varshell变量的值,然后又得到了刚刚被处理的shell变量的值。$value1file1$value2file2

如果有的话文件具有上一个示例中的名称var="$value1"(例如var="42",这是一个完全合法的 Unix 文件名),该文件将不是被处理。此外,如果命令行上的 shell 文件名通配模式选取的文件的名称看起来像是对变量的赋值,则该赋值将在脚本中处于活动状态awk

相关内容