在处理脚本时,以下脚本出错
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
变量$value1
在file1
被处理之前获得shell变量的值,然后在被处理$value2
之前的shell变量的值file2
。
如果任何文件具有var="$value1"
上一个示例中的名称(例如var="42"
,这是一个完全合法的 Unix 文件名),则不会处理该文件。此外,如果命令行上的 shell 文件名通配模式选择了一个名称看起来像对变量赋值的文件,则此赋值将在awk
脚本中处于活动状态。
归档时间: |
|
查看次数: |
14072 次 |
最近记录: |