第5.2节:awk变量的使用
1 第5.2节:awk变量的使用
在awk中,变量不需要事先声明,直接赋值即可定义变量,变量的类型是动态的!
$ echo ""|awk '
> {
> a=16
> print(a)
> a="text"
> print(a)
> }'
16
text
🕮说明:先给变量a赋值数字,再给变量a赋值字符串,变量a可以无缝转换。
::: alert-danger
未初始化的变量直接使用会带来很多问题, 可能在当下运行不会暴露出问题,但经过一段时间,场景变化化,会出现意想不到的问题,且此时再定位的成本会非常高,建议所有变量都有明确的定义(初始化)。
:::
1.1 在程序中使用变量
变量让你可以为值赋予名称,之后再引用这些值。在很多示例中已经使用过变量了。变量的名称必须是由字母、数字或下划线组成的序列,且不能以数字开头。这里的“字母”指的是任何英文字母(大小写均可 )。在非英语语言环境中可能被定义为字母的其他字符,不能用于变量名称。变量名称区分大小写;a
和 A
是不同的变量。
变量名本身就是一个有效的表达式,它代表该变量当前的值。可通过赋值运算符、自增运算符和自减运算符为变量赋予新值。此外,sub()
和 gsub()
函数可更改变量的值,match()
、split()
和 patsplit()
函数可更改其数组参数的内容。
有几个变量具有特殊的内置含义,比如 FS
(字段分隔符 )和 NF
(当前输入记录的字段数量 )。关于预定义变量的列表。这些预定义变量的使用和赋值方式与其他变量一样,但 awk
也会自动使用或更改它们的值。所有预定义变量的名称均为全大写。
awk
中的变量可以被赋予数值或字符串值。变量存储的值的类型在程序运行过程中可能发生变化。默认情况下,变量会被初始化为空字符串,若转换为数字,空字符串等同于 0 。在 awk
中无需显式初始化变量,而在 C 语言以及大多数其他传统语言中则需要这样做。
1.2 在命令行上为变量赋值
调用 awk
时,可通过在命令行参数中加入变量赋值语句,设置任意 awk
变量。这种赋值语句的形式如下:
variable=text
借助此方式,变量可在 awk
运行开始时,或在输入文件之间被设置。当赋值语句前加 -v
选项时,如下所示:
-v variable=text
变量会在最开始被设置,甚至在 BEGIN
规则执行之前。-v
选项及其赋值语句必须位于所有文件名参数以及程序文本之前。否则,变量赋值的执行时机由其在输入文件参数中的位置决定——在处理完前一个输入文件参数之后。例如:
awk '{ print $n }' n=4 inventory-shipped n=2 mail-list
该命令会打印所有输入记录中第 n
个字段的值。在读取第一个文件前,命令行将变量 n
设为 4 ,这会使 inventory-shipped
文件的行中打印第四个字段。第一个文件处理完后,在开始处理第二个文件(mail-list
)前,n
被设为 2 ,因此 mail-list
文件的行中会打印第二个字段:
$ awk '{ print $n }' n=4 inventory-shipped n=2 mail-list
-| 15
-| 24
...
-| 555-5553
-| 555-3412
...
命令行参数可通过 awk
程序的 ARGV
数组供显式检查。awk
会处理命令行赋值中的转义序列。
通常,在命令行上赋值的变量(无论是否用 -v
选项 )会被视为字符串。当这些变量作为数字使用时,awk
会按常规自动将字符串转换为数字,一切“自然生效”。
不过,gawk
支持类型为 regexp
的变量。你可使用以下语法为这种类型的变量赋值:
gawk -v 're1=@/foo|bar/' '...' /path/to/file 're2=@/baz|quux/' /path/to/file
作者声明:本文用于记录和分享作者的学习心得,可能有部分文字或示例来自AI平台,如:豆包、DeepSeek(硅基流动)(注册链接)等,由于本人水平有限,难免存在表达错误,欢迎留言交流和指教!
Copyright © 2022~2025 All rights reserved.