当前位置: 首页 > news >正文

第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 在程序中使用变量

  变量让你可以为值赋予名称,之后再引用这些值。在很多示例中已经使用过变量了。变量的名称必须是由字母、数字或下划线组成的序列,且不能以数字开头。这里的“字母”指的是任何英文字母(大小写均可 )。在非英语语言环境中可能被定义为字母的其他字符,不能用于变量名称。变量名称区分大小写;aA 是不同的变量。

变量名本身就是一个有效的表达式,它代表该变量当前的值。可通过赋值运算符、自增运算符和自减运算符为变量赋予新值。此外,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.

http://www.dtcms.com/a/342035.html

相关文章:

  • 适配器模式 java demo
  • 电能质量监测装置 分布式光伏安全并网“准入证”
  • AI工作负载“加速跑”,高性能网络如何“护航”?
  • EfficientVMamba代码略讲
  • 档案宝系统功能:权限分级,保障档案安全
  • KingbaseES数据库增删改查操作分享
  • 项目集成 Chrono 时间轴
  • Pytest 插件怎么写:从0开发一个你自己的插件
  • SamOutVXP: 轻量级高效语言模型
  • 用nohup setsid绕过超时断连,稳定反弹Shell
  • Spring 循环依赖:从 “死锁” 到 “破局” 的完整解析
  • 在.NET 8 中使用中介模式优雅处理多版本 API 请求
  • 大数据毕业设计选题推荐-基于大数据的鲍鱼多重生理特征数据可视化分析系统-Spark-Hadoop-Bigdata
  • AUTOSAR自适应平台(AP)中元类(Metaclass)、建模(Modeling) 和 ARXML 这三者的核心关系与区别
  • 阿里云上部署nuxt开发的项目(SSG和SSR混合渲染)
  • Qwen2-阿里云最新发布的通义千问开源大模型
  • AR眼镜在制造业的生产设备智慧运维方案介绍
  • CRMEB私域电商系统后台开发实战:小程序配置全流程解析
  • Unity 二进制读写小框架
  • 机器人 - 无人机基础(4) - FreeRTOS
  • MFC随笔—不使用对话框资源模板创建对话框
  • 嵌入式ARM程序高级调试基础:8.QEMU ARM虚拟机与tftp配置
  • QT的项目pro qmake编译
  • OpenCV结构光三维重建类cv::structured_light::GrayCodePattern
  • 01 网络信息内容安全--绪论
  • OpenCV图像色彩空间转换
  • OpenCV图像形态学操作
  • SigNoz 外置 ClickHouse 高可用部署实践
  • Qt二维码生成器项目开发教程 - 从零开始构建专业级QR码生成工具
  • AI + 云原生 + ITSM 的三重融合:企业数字化转型的新引擎