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

Gyp*_*aut 6 parameter awk

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

file * | awk '{ ${1}=""; print substr(${0},2) }';
Run Code Online (Sandbox Code Playgroud)

虽然以下两个脚本都成功运行

file * | awk '{ $"1"=""; print substr($"0",2) }';
Run Code Online (Sandbox Code Playgroud)

file * | awk '{ $1=""; print substr($0,2) }';
Run Code Online (Sandbox Code Playgroud)

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

Kus*_*nda 15

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

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

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

$ awk -v var="$var" '{...}'
Run Code Online (Sandbox Code Playgroud)

你也可以给awk脚本一个 shell 变量的值,如下所示:

$ awk '{...}' var="$var"
Run Code Online (Sandbox Code Playgroud)

这是几乎同样的事情与做它-v除了变量var将是任何空BEGIN块。查看输入数据之前BEGIN执行一个块,并且在执行这样一个块之后设置变量。

你也可以这样做

$ awk '{...}' var="$value1" file1 var="$value2" file2
Run Code Online (Sandbox Code Playgroud)

这使得var变量$value1file1被处理之前获得shell变量的值,然后在被处理$value2之前的shell变量的值file2

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

  • 还有`$ 1`、`$(0+2/2)`、`$ length("a")`。重要的是要意识到 `$` 是一个操作符,而不是像 shell 中的参数引入器。 (2认同)
  • 人们应该避免使用“-v”从 shell 导入变量,因为如果它们包含反斜杠,它会破坏这些值。最好在“awk”中使用环境和“ENVIRON”特殊哈希。 (2认同)