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模式:允许在脚本执行过程中手动控制输入行的读取和处理方式

常用命令行选项

  1. -F separator
  • 描述:指定字段分隔符。默认情况下,字段分隔符为任何空白字符序列
  • 示例:
awk -F ',' '{ print $1 }' filename
-F ',' 指定逗号为字段分隔符,然后打印每行的第一个字段
  1. -v var=value
  • 描述:设置 AWK 变量的值。可以在 AWK 脚本中使用 -v 选项来传递变量
  • 示例:
awk -v threshold=50 '$1 > threshold { print $0 }' filename
示例中,定义了一个变量 threshold 并将其传递给 AWK 脚本,然后根据条件打印符合要求的行
  1. -f script-file
  • 描述:从指定的文件中读取 AWK 脚本
  • 示例:
awk -f myscript.awk data.txt
示例中,AWK 将执行 myscript.awk 文件中的脚本来处理 data.txt 文件

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/41358.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

R语言实战—圆形树状图

话不多说&#xff0c;先看最终效果&#xff1a; 圆形树状图是树状图的一个变型&#xff0c;其实都是层次聚类。 接下来看代码步骤&#xff1a; 首先要先安装两个包&#xff1a; install.packages("ggtree") install.packages("readxl") 咱就别问问什么…

29、php实现和为S的两个数字(含源码)

题目&#xff1a;php 实现 和为S的两个数字 描述&#xff1a; 输入一个递增排序的数组和一个数字S&#xff0c;在数组中查找两个数&#xff0c; 是的他们的和正好是S&#xff0c;如果有多对数字的和等于S&#xff0c;输出两个数的乘积最小的。 输出描述&#xff1a; 对应每个测…

go zero入门

一、goctl安装 goctl 是 go-zero 的内置脚手架&#xff0c;可以一键生成代码、文档、部署 k8s yaml、dockerfile 等。 # Go 1.16 及以后版本 go install github.com/zeromicro/go-zero/tools/goctllatest检查是否安装成功 $ goctl -v goctl version 1.6.6 darwin/amd64vscod…

vue2响应式原理+模拟实现v-model

效果 简述原理 配置对象传入vue实例 模板解析&#xff0c;遍历出所有文本节点&#xff0c;利用正则替换插值表达式为真实数据 data数据代理给vue实例&#xff0c;以后通过this.xxx访问 给每个dom节点增加观察者实例&#xff0c;由观察者群组管理&#xff0c;内部每一个键值…

sqlite 数据库 介绍

文章目录 前言一、什么是 SQLite &#xff1f;二、语法三、SQLite 场景四、磁盘文件 前言 下载 目前已经出到了&#xff0c; Version 3.46.0 SQLite&#xff0c;是一款轻型的数据库&#xff0c;是遵守ACID的关系型数据库管理系统&#xff0c;它包含在一个相对小的C库中。它是…

VMware虚拟机配置桥接网络

转载&#xff1a;虚拟机桥接网络配置 一、VMware三种网络连接方式 VMware提供了三种网络连接方式&#xff0c;VMnet0, VMnet1, Vmnet8&#xff0c;分别代表桥接&#xff0c;Host-only及NAT模式。在VMware的编辑-虚拟网络编辑器可看到对应三种连接方式的设置&#xff08;如下图…

美好生活的 100 条建议

简介 一些简洁明了的人生建议&#xff0c;易于理解&#xff0c;并且能够为日常生活中的各个方面提供实用的指导。 财富 (Possessions) 1. If you want to find out about people’s opinions on a product, google \reddit. You’ll get real people arguing, as compared t…

SpringBoot2.2.6使用spring-boot-validation读取不到自定义配置文件中的属性

SpringBoot2.2.6没有做message.properties文件中属性的自动读取配置。解决方法有两种&#xff1a; 1. 升级springboot版本到2.6.x以上 2. 在现有springboot版本的基础上添加以下自定义配置&#xff1a; Configuration public class RequestParamValidationConfig implements…

学习笔记——交通安全分析12

目录 前言 当天学习笔记整理 4信控交叉口交通安全分析 结束语 前言 #随着上一轮SPSS学习完成之后&#xff0c;本人又开始了新教材《交通安全分析》的学习 #整理过程不易&#xff0c;喜欢UP就点个免费的关注趴 #本期内容接上一期11笔记 当天学习笔记整理 4信控交叉口交…

ORA-03115 ORA-06594--空间不足 rman 磁带压缩备份 控制文件恢复后备份信息丢失

---用旧的控制文件恢复后 这个控制文件本身的备份信息不在此还原出的控制文件中。所以这个备份的控制文件就删不掉&#xff0c;看不到。 但是只要设置正确的dbid&#xff0c;还是可以用恢复这个控制文件的 正常未恢复过controlfile的话&#xff0c;这个控制文件备份信息在现有…

Square Root SAM论文原理

文章目录 Square Root SAM论文原理核心原理SLAM问题的3种表示贝叶斯网络因子图&#xff08;Factor graph&#xff09;马尔科夫随机场(Markov Random Field, MRF) SLAM最小二乘问题&线性化因式分解 factorization矩阵与图(Matrices ⇔ Graphs)因式分解&变量消元(Factori…

Kafka系列之Kafka知识超强总结

一、Kafka简介 Kafka是什么 Kafka是一种高吞吐量的分布式发布订阅消息系统&#xff08;消息引擎系统&#xff09;&#xff0c;它可以处理消费者在网站中的所有动作流数据。 这种动作&#xff08;网页浏览&#xff0c; 搜索和其他用户的行动&#xff09;是在现代网络上的许多社…

14-22 剑和远方2 - 深度神经网络中的学习机制

概论 在第一部分中&#xff0c;我们深入探讨了人工智能的兴衰简史以及推动人工智能发展的努力。我们研究了一个简单的感知器&#xff0c;以了解其组件以及简单的 ANN 如何处理数据和权重层。在简单的 ANN 中&#xff0c;不会对数据执行特定操作。ANN 中的激活函数是一个线性函…

Surface splatting (2D Gaussian splatting)代码分析

源码地址 colab.research.google.com/drive/1qoclD7HJ3-o0O1R8cvV3PxLhoDCMsH8W 核心代码 surface_splatting def surface_splatting(means3D, scales, quats, colors, opacities, intrins, viewmat, projmat):# Rasterization setupprojmat torch.zeros(4,4).cuda()projm…

flask使用定时任务flask_apscheduler(APScheduler)

Flask-APScheduler描述: Flask-APScheduler 是一个 Flask 扩展&#xff0c;增加了对 APScheduler 的支持。 APScheduler 有三个内置的调度系统可供您使用&#xff1a; Cron 式调度&#xff08;可选开始/结束时间&#xff09; 基于间隔的执行&#xff08;以偶数间隔运行作业…

c#中的超时终止

在C#中&#xff0c;可以使用CancellationToken和Task的超时机制来实现调用方法时的超时终止。 一 用Task.Delay(int)模拟耗时操作 static async Task Main(string[] args){using (var cts new CancellationTokenSource(1 * 1000)){await doSomething(cts.Token);}Console.Wr…

移动校园(7)ii:uniapp响应拦截器处理token,以及微信小程序报错当前页面正在处于跳转状态,请稍后再进行跳转....

依据昨天的写完&#xff0c;在token过期之后&#xff0c;再次调用接口&#xff0c;会触发后端拦截&#xff0c;扔进全局错误处理中间件 前端说明提示都没有&#xff0c;只有一个这个&#xff0c;现在优化一下&#xff0c;再写一个类似全局后置守卫&#xff0c;当状态码是401的时…

RAID 冗余磁盘阵列

RAID也是Linux操作系统中管理磁盘的一种方式。 只有Linux操作系统才支持LVM的磁盘管理方式。 而RAID是一种通用的管理磁盘的技术&#xff0c;使用于多种操作系统。 优势&#xff1a;提升数据的读写速度&#xff0c;提升数据的可靠性。具体实现哪什么功能&#xff0c;要看你所…

RGB树-美团2023笔试(codefun2000)

题目链接 RGB树-美团2023笔试(codefun2000) 题目内容 塔子哥是一位著名的冒险家&#xff0c;他经常在各种森林里探险。今天&#xff0c;他来到了道成林&#xff0c;这是一片美丽而神秘的森林。在探险途中&#xff0c;他遇到了一棵 n 个节点的树&#xff0c;树上每个节点都被涂…

LVGL移植与VS模拟器使用

一、移植文件介绍 二、移植部分 第一步&#xff1a;创建LVGL文件夹 第二步&#xff1a; 构造LVGL文件夹&#xff1a;LVGL - GUI - lvgl - 第三步&#xff1a;添加文件 3.1 从examples中添加2个.c文件 3.2 从src中添加文件 draw文件 extra文件 第四步&#xff1a; 三、Ke…