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…...

聚类分析方法(一)
目录 一、聚类分析原理(一)聚类分析概述(二)聚类的数学定义(三)簇的常见类型(四)聚类框架及性能要求(五)簇的距离 二、划分聚类算法(一࿰…...

Midjourney对图片细微调整和下载保存
点击v2是对第二图片细微调整。 点击u3对第3张图片进行放大。 保存图片: 对点击u3放大的图片,双击 , 右键保存图片...

Python文件写入操作
本套课在线学习视频(网盘地址,保存到网盘即可免费观看): https://pan.quark.cn/s/b19a7c910cf6 在Python编程中,文件操作是一项基础且重要的技能。本文将详细介绍如何使用Python将列表内容写入文件以实现文件…...

FPGA_GTX:简要版
1. GTX介绍 Xilinx FPGA的GT意思是Gigabyte Transceiver。通常称呼为Serdes、高速收发器。GT在xilinx不同系列有着不同的产品,从7系列到UltraScale系列分别有GTP、GTX、GTZ、GTH、GTY和GTM。不同GT整体结构上类似,为了支持越来越高的line rateÿ…...

使用mq向队列发送消息流程
新建队列q1和q2绑定交换机和队列之间的消息路由向默认的交换机发送消息查看两个队列中的交换机消息(get messages),也可以在overview选项卡页面查看实时流量图 这里注意: 1.交换机是转发消息用的,他并没有存储消息的…...

Git中两个开发分支merge的原理
一 分支合并 1.1 原理 分支合并:就是将A分支修改后且commit的内容,合并到B分支,这些修改且提交的内容和B分支对应的内容和位置进行比较: 1.不一样的话,提示冲突,需要人工干预。 2.一样的话,…...

数字图像处理、机器视觉(计算机视觉)、计算图形学概念
数字图像处理(Digital Image Processing)--又称为计算机图像处理,它是指将图像信号转换成数字信号并利用计算机对其进行处理的过程,以提高图像的实用性,达到人们所要求的预期结果。从输入到输出来看,数字图…...

Android SurfaceFlinger ——获取显示屏信息(十八)
经过前面文章对开机启动动画的流程梳理,引出了实际上在开机启动动画中,并没有Activity,而是通过 OpenGL es 进行渲染,最后通过某种方式,把数据交给 Android 渲染系统。 让我们回忆一下开机动画前期准备的相关步骤,大致分为如下几个: 1)getInternalDisplayToken:获取显…...

QCustomPlot+ vs2022+ qt
零、printSupport 步骤一:下载QCustomPlot 访问QCustomPlot的官网 QCustomPlot 下载最新版本的源代码。 步骤二:配置项目 创建新的Qt项目: 打开VS2022,创建一个新的Qt Widgets Application项目。 将QCustomPlot源代码添加到项目…...

Perl 语言开发(五):循环语句
目录 1. 循环语句概述 2. while 循环 2.1 基本语法 2.2 示例 2.3 无限循环 3. until 循环 3.1 基本语法 3.2 示例 3.3 无限循环 4. for 循环 4.1 基本语法 4.2 示例 4.3 嵌套循环 5. foreach 循环 5.1 基本语法 5.2 示例 5.3 遍历哈希 6. 循环控制语句 6.1 …...

线性系统理论及应用GUI设计及仿真
目录 1.控制系统的状态空间模型 1.1.状态空间模型 1.2 传递函数模型 1.3 传递函数转换为状态空间模型 1.4.状态空间模型转换为传递函数 1.5.状态空间模型转化为约当标准型 2.线性系统的时域分析 2.1.矩阵指数函数的计算 2.2.线型定常连续系统的状态空间模型求解 3.线…...