shell-awk语法整理
shell-awk语法整理
- 前言
- 基本语法
- 内置变量
- 1. $0
- 2. NF
- 3. NR
- 4. FS
- 5. RS
- 6. OFS
- 7. ORS
- 8. FILENAME
- 9. FNR
- 10. ARGV
- 11. ENVIRON
- 12. IGNORECASE
- 13. RSTART 和 RLENGTH
- 示例解释
- 内置函数
- 循环语句(后面的';'可不加)
- 条件语句
- 高级特性
- 示例
- 特殊模式
- BEGIN
- END
- 组合示例
- BEGINFILE 和 ENDFILE
- getline 模式
- 总结
- 常用命令行选项
前言
AWK是一种功能强大的文本处理工具,可根据指定的规则对文本和数据文件进行逐行处理,通过灵活使用模式和动作的组合,可以实现复杂的文本分析和数据处理任务,适合处理各种格式的文本文件和数据流
基本语法
AWK的基本语法结构为:
awk pattern '{ action }' filename
- pattern:用来匹配输入数据的模式
- action:在匹配到符合模式的行时执行的操作
- filename:要操作的目标文件
例如,要打印每行以字母 “a” 开头的文本:
awk '/^a/ { print }' filename
其中,/^a/ 是模式,{ print } 是操作,会打印文件中所有以字母 “a” 开头的行
内置变量
AWK 提供了许多内置变量,用于获取关于输入数据、当前行、行号等信息
1. $0
- 描述:代表当前行的内容
- 示例:打印所有行的内容(print后面什么都不带,也是一样的效果)
awk '{ print $0 }' filename
2. NF
- 描述:代表当前行的字段数
- 示例:打印每行的字段数
awk '{ print NF }' filename
3. NR
- 描述:代表当前行的行号
- 示例:打印每行的行号和内容
awk '{ print NR, $0 }' filename
4. FS
- 描述:代表字段分隔符,默认是空白字符
- 示例:使用不同的字段分隔符打印字段内容
awk -F':' '{ print $1, $2 }' filename
5. RS
- 描述:代表记录分隔符,默认是换行符
- 示例:按不同的记录分隔符处理数据
awk 'BEGIN { RS="@" } { print $0 }' filename
6. OFS
- 描述:代表输出字段分隔符
- 示例:设置不同的输出字段分隔符
awk 'BEGIN { OFS=" | " } { print $1, $2 }' filename
7. ORS
- 描述:代表输出记录分隔符
- 示例:设置不同的输出记录分隔符
awk 'BEGIN { ORS="\n\n" } { print $0 }' filename
8. FILENAME
- 描述:代表当前输入文件的名称
- 示例:打印当前处理的文件名
awk '{ print FILENAME }' filename
9. FNR
- 描述:代表当前处理的文件中的行号,从1开始计数
- 示例:打印当前处理的行号和内容
awk '{ print FNR, $0 }' filename
10. ARGV
- 描述:一个包含命令行参数的数组
- 示例:遍历打印命令行参数
awk 'BEGIN { for (i = 0; i < ARGC; i++) print ARGV[i] }' file1 file2
11. ENVIRON
- 描述:一个包含环境变量的关联数组
- 示例:打印所有环境变量及其值
awk 'BEGIN { for (var in ENVIRON) print var, ENVIRON[var] }'
12. IGNORECASE
- 描述:控制字符串匹配时是否忽略大小写
- 示例:在匹配时忽略大小写
awk 'BEGIN { IGNORECASE=1 } /pattern/ { print }' filename
13. RSTART 和 RLENGTH
- 描述:
- RSTART:上次 match() 函数匹配的起始位置
- RLENGTH:上次 match() 函数匹配的长度
- 示例:使用 match() 函数找到并打印匹配的子字符串及其位置
awk '{ if (match($0, /pattern/)) print "Found:", substr($0, RSTART, RLENGTH) }' filename
示例解释
- $0:表示当前行的全部内容
- NF:表示当前行的字段数
- NR:表示当前行的行号
- FS:用于指定字段分隔符
- RS:用于指定记录分隔符
- OFS:用于指定输出字段分隔符
- ORS:用于指定输出记录分隔符
- FILENAME:用于输入文件的名称
- FNR:用于输入当前处理的文件中的行号
- ARGV:输出命令行参数的数组
- ENVIRON:输出环境变量的关联数组
- IGNORECASE:控制字符串匹配时是否忽略大小写
- RSTART:上次 match() 函数匹配的起始位置
- RLENGTH:上次 match() 函数匹配的长度
内置函数
AWK 提供了多种内置函数,用于字符串处理、数学计算等
- 字符串函数:
- length(str):返回字符串长度
- index(str, search):返回搜索字符串在原字符串中的位置
- split(str, arr, sep):将字符串按分隔符分割成数组
- 数学函数:
- sin(x)、cos(x)、sqrt(x):三角函数和平方根函数
- rand():返回一个0到1之间的随机数
循环语句(后面的’;'可不加)
AWK支持类C语言风格的循环语句:
- for循环:
for (i = 1; i <= 10; i++) {print i;
}
- while循环:
while (condition) {print $0;getline;
}
条件语句
AWK 中的条件语句与其他编程语言类似:
- if语句:
if (condition) {print "Condition is true";
} else {print "Condition is false";
}
- switch语句:
switch (variable) {case value1: {print "Value 1";break;}case value2: {print "Value 2";break;}default: {print "Default case";break;}
}
高级特性
AWK还支持更高级的特性,如函数定义、数组操作和模式动作的组合使用:
- 函数定义:
function add(x, y) {return x + y;
}
- 数组操作:
# 创建数组
arr["key1"] = "value1";
arr["key2"] = "value2";# 遍历数组
for (key in arr) {print key, arr[key];
}
示例
演示了AWK的基本语法、内置变量、函数、循环和条件语句的使用:
# AWK script to print lines containing "error"
# and count lines where first field is numeric# Print lines containing "error"
/error/ {print;
}# Count lines where first field is numeric
$1 ~ /^[0-9]+$/ {count++;
}# END block to print count
END {print "Numeric lines count:", count;
}
特殊模式
BEGIN
-
描述:BEGIN 块用于在处理任何输入数据之前执行初始化任务,例如设置变量、打印标题、配置输出格式等BEGIN 块中的代码在任何输入数据处理之前运行一次
-
示例:打印表头,并设置字段分隔符
awk 'BEGIN { OFS = "\t"; print "Name", "Age", "City" } { print $1, $2, $3 }' filename
示例中在处理 filename 文件之前,会打印表头 “Name”, “Age”, “City”,并将输出字段分隔符 (OFS) 设置为制表符
END
-
描述:END 块用于在处理所有输入数据之后执行任务,例如打印总结信息、计算总和或平均值等。END 块中的代码在所有输入数据处理完后运行一次
-
示例:计算并打印行数
awk 'END { print "Total lines:", NR }' filename
示例中在处理完 filename 文件的所有行之后,打印总行数,其中 NR 是记录数的内置变量,表示总行数
组合示例
可同时使用 BEGIN 和 END 块来初始化和总结数据处理:
awk 'BEGIN { print "Processing file:", FILENAME } { sum += $2 } END { print "Total sum of second column:", sum }' filename
- BEGIN { print “Processing file:”, FILENAME }:在处理任何数据之前打印当前处理的文件名
- { sum += $2 }:处理每一行,将第二列的值累加到 sum 变量中
- END { print “Total sum of second column:”, sum }:在处理完所有数据后,打印第二列值的总和
BEGINFILE 和 ENDFILE
-
描述:
- BEGINFILE:在处理每个输入文件之前执行一次
- ENDFILE:在处理每个输入文件之后执行一次
-
示例:
awk 'BEGINFILE { print "Start processing", FILENAME }{ print $0 }ENDFILE { print "End processing", FILENAME }' file1 file2
示例会在处理每个输入文件 file1 和 file2 前后分别打印处理开始和处理结束的消息
getline 模式
-
描述:
- getline 模式用于手动从输入中读取下一行并处理。可与条件和循环结构一起使用,以控制输入数据的处理方式
-
示例:
awk '/pattern/ { print "Found:", $0 if (getline next_line > 0) { print "Next line:", next_line } }' filename
示例会在匹配到某个模式后,打印当前行和下一行的内容(如果存在)
总结
- BEGIN:特殊模式块,用于在处理输入数据之前执行初始化操作
- END:特殊模式块,用于在处理完所有输入数据后执行总结或清理操作
- BEGINFILE 和 ENDFILE:用于在处理每个输入文件前后执行特定操作
- getline模式:允许在脚本执行过程中手动控制输入行的读取和处理方式
常用命令行选项
- -F separator
- 描述:指定字段分隔符。默认情况下,字段分隔符为任何空白字符序列
- 示例:
awk -F ',' '{ print $1 }' filename
-F ',' 指定逗号为字段分隔符,然后打印每行的第一个字段
- -v var=value
- 描述:设置 AWK 变量的值。可以在 AWK 脚本中使用 -v 选项来传递变量
- 示例:
awk -v threshold=50 '$1 > threshold { print $0 }' filename
示例中,定义了一个变量 threshold 并将其传递给 AWK 脚本,然后根据条件打印符合要求的行
- -f script-file
- 描述:从指定的文件中读取 AWK 脚本
- 示例:
awk -f myscript.awk data.txt
示例中,AWK 将执行 myscript.awk 文件中的脚本来处理 data.txt 文件
相关文章:
shell-awk语法整理
shell-awk语法整理 前言基本语法内置变量1. $02. NF3. NR4. FS5. RS6. OFS7. ORS8. FILENAME9. FNR10. ARGV11. ENVIRON12. IGNORECASE13. RSTART 和 RLENGTH示例解释 内置函数循环语句(后面的;可不加)条件语句高级特性示例 特殊模式BEGINEND组合示例BEG…...

关于忠诚:忠于自己的良知、理想、信念
关于忠诚: 当我们面对公司、上司、爱人、恋人、合作伙伴还是某件事,会纠结离开还是留下,这里我们要深知忠诚的定义,我们不是忠诚于某个人、某件事、或者某个机构,而是忠诚于自己的良知,忠诚于自己的理想和…...

探索Linux:开源世界的无限可能
Linux是一款开源操作系统,它的起源可以追溯到上世纪90年代初。这个故事始于一个名叫Linus Torvalds的芬兰大学生,他在1983年开始编写一个用于个人电脑的操作系统内核。在他的努力下,Linux逐渐发展成为一个稳定而强大的操作系统。 然而&#…...

深度学习之半监督学习:一文梳理目标检测中的半监督学习策略
什么是半监督目标检测? 传统机器学习根据训练数据集中的标注情况,有着不同的场景,主要包括:监督学习、弱监督学习、弱半监督学习、半监督学习。由于目标检测任务的特殊性,在介绍半监督目标检测方法之前,我…...

Hive 高可用分布式部署详细步骤
目录 系统版本说明 hive安装包下载及解压 上传mysql-connector-java的jar包 配置环境变量 进入conf配置文件中,将文件重命名 在hadoop集群上创建文件夹 创建本地目录 修改hive-site.xml文件 同步到其他的节点服务器 修改node02中的配置 hive-site.xml 修改…...

ubuntu下运行程序时提示缺库问题的有效解决方法
目录 一、问题现象二、解决方式三、总结 一、问题现象 当我们平时在ubuntu上运行一个程序时时长会遇到如下情况,含义为本机缺少执行程序需要的库 这时候我们可能会根据缺少的库使用apt install 库名的模糊名字 进行安装,然后再去运行,此时可…...
GNU/Linux - wic文件的使用
Yocto/OpenEmbedded使用的磁盘镜像格式是 wic。为嵌入式系统提供 bootable images。 The disk image format used in the Yocto Project is wic. .wic 文件显然只是一个带有分区表和分区的磁盘镜像,就像下载 Linux 发行版时获得的所有 .img 文件一样。这就是为什么你…...

前端JS 插件实现下载【js-tool-big-box,下载大文件(fetch请求 + 下载功能版)
上一节,我们添加了下载大文件的纯功能版,意思就是需要开发者,在自己项目里发送请求,请求成功后,获取文件流的blob数据,然后 js-tool-big-box 帮助下载。 但考虑到,有些项目,可能比较…...

JVM专题之垃圾收集器
JVM参数 3.1.1 标准参数 -version -help -server -cp 3.1.2 -X参数 非标准参数,也就是在JDK各个版本中可能会变动 ``` -Xint 解释执行 -Xcomp 第一次使用就编译成本地代码 -Xmixed 混合模式,JVM自己来决定 3.1.3 -XX参数 > 使用得最多的参数类型 > > 非…...

SSM养老院管理系统-计算机毕业设计源码02221
摘要 本篇论文旨在设计和实现一个基于SSM的养老院管理系统,旨在提供高效、便捷的养老院管理服务。该系统将包括老人档案信息管理、护工人员管理、房间信息管理、费用管理等功能模块,以满足养老院管理者和居民的不同需求。 通过引入SSM框架&#x…...

使用Keil将STM32部分程序放在RAM中运行
手动分配RAM区域,新建.sct文件,定义RAM_CODE区域,并指定其正确的起始地址和大小。 ; ************************************************************* ; *** Scatter-Loading Description File generated by uVision *** ; ************************************************…...

【MySQL8.0】 CentOS8.0下安装mysql报错权限问题的记录
这里写自定义目录标题 基本信息问题记录 基本信息 OS: Linux server-02 4.18.0-240.el8.x86_64 #1 SMP Fri Sep 25 19:48:47 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux MySQL: 8.0 问题记录 缺少类库 mysql: error while loading shared libraries: libncurses.so.5: cannot…...
在内网互通的服务器中自由跳转与数据管理
在服务器中自由跳转与数据管理:实用命令指南 在管理或使用集群服务器环境时,高效地在不同节点间跳转、执行命令以及数据的相互拷贝是日常操作的重要组成部分。 1. 在集群节点间自由跳转:SSH(Secure Shell) SSH 是实…...

Arcgis Api 三维聚合支持最新版API
Arcgis Api 三维聚合支持最新版API 最近有同学问我Arcgis api 三维聚合,官方还不支持三维聚合API,二维可以。所以依旧是通过GraphicLayers 类来实现,可支持最新Arcgis Api版本 效果图:...
在Conda环境中高效使用Kubernetes:跨平台容器化实践指南
摘要 Conda 是一个流行的跨平台包和环境管理器,广泛用于Python社区。而 Kubernetes 是一个开源的容器编排系统,用于自动化部署、扩展和管理容器化应用程序。本文将探讨如何在 Conda 环境中使用 Kubernetes,包括设置 Conda 环境、容器化应用程…...
scikit-learn超参数调优 (自动寻找模型最佳参数) 方法
网格搜索(Grid Search): 原理:网格搜索通过预定义的参数组合进行穷举搜索,评估每一种参数组合的性能,选择性能最佳的参数组合。实现:使用GridSearchCV类。示例代码:from sklearn.mod…...

零基础STM32单片机编程入门(八)定时器PWM输入实战含源码视频
文章目录 一.概要二.PWM输入框架图三.CubeMX配置一个PWM输入例程1.硬件准备2.创建工程3.调试 四.CubeMX工程源代码下载五.讲解视频链接地址六.小结 一.概要 脉冲宽度调制(PWM),是英文“Pulse Width Modulation”的缩写,简称脉宽调制,是利用单…...
spring cloud gateway客户端websocket断开连接,服务侧连接没有关闭的问题处理
之前在单体架构项目中使用了websocket主动推送消息的功能,后来改成了微服务架构,结果发现部分消息丢失,没能推送给客户端;深入排查发现服务端无法感知websocket连接状态,但是在单体架构里面是没这个问题的,…...

确认下单:购物车页面点击 去结算 按钮发起两个请求trade(显示购物车的商品信息和计算商品的总金额)findUserAddressList
文章目录 1、确认下单:购物车页面点击去结算1.1、在OrderController类中创建 trade 方法1.2、在CartController类中创建 checkedCartInfos1.3、CartServiceImpl 实现 checkedCartInfos的业务功能1.4、在service-cart-client模块下定义远程openFeign接口1.5、在SpzxO…...

聚类分析方法(一)
目录 一、聚类分析原理(一)聚类分析概述(二)聚类的数学定义(三)簇的常见类型(四)聚类框架及性能要求(五)簇的距离 二、划分聚类算法(一࿰…...
Python爬虫实战:研究MechanicalSoup库相关技术
一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...

突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合
强化学习(Reinforcement Learning, RL)是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程,然后使用强化学习的Actor-Critic机制(中文译作“知行互动”机制),逐步迭代求解…...
vue3 字体颜色设置的多种方式
在Vue 3中设置字体颜色可以通过多种方式实现,这取决于你是想在组件内部直接设置,还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法: 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...
Qt Http Server模块功能及架构
Qt Http Server 是 Qt 6.0 中引入的一个新模块,它提供了一个轻量级的 HTTP 服务器实现,主要用于构建基于 HTTP 的应用程序和服务。 功能介绍: 主要功能 HTTP服务器功能: 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...

高危文件识别的常用算法:原理、应用与企业场景
高危文件识别的常用算法:原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件,如包含恶意代码、敏感数据或欺诈内容的文档,在企业协同办公环境中(如Teams、Google Workspace)尤为重要。结合大模型技术&…...

JVM 内存结构 详解
内存结构 运行时数据区: Java虚拟机在运行Java程序过程中管理的内存区域。 程序计数器: 线程私有,程序控制流的指示器,分支、循环、跳转、异常处理、线程恢复等基础功能都依赖这个计数器完成。 每个线程都有一个程序计数…...

C/C++ 中附加包含目录、附加库目录与附加依赖项详解
在 C/C 编程的编译和链接过程中,附加包含目录、附加库目录和附加依赖项是三个至关重要的设置,它们相互配合,确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中,这些概念容易让人混淆,但深入理解它们的作用和联…...

代码规范和架构【立芯理论一】(2025.06.08)
1、代码规范的目标 代码简洁精炼、美观,可持续性好高效率高复用,可移植性好高内聚,低耦合没有冗余规范性,代码有规可循,可以看出自己当时的思考过程特殊排版,特殊语法,特殊指令,必须…...
tomcat入门
1 tomcat 是什么 apache开发的web服务器可以为java web程序提供运行环境tomcat是一款高效,稳定,易于使用的web服务器tomcathttp服务器Servlet服务器 2 tomcat 目录介绍 -bin #存放tomcat的脚本 -conf #存放tomcat的配置文件 ---catalina.policy #to…...
日常一水C
多态 言简意赅:就是一个对象面对同一事件时做出的不同反应 而之前的继承中说过,当子类和父类的函数名相同时,会隐藏父类的同名函数转而调用子类的同名函数,如果要调用父类的同名函数,那么就需要对父类进行引用&#…...