正则表达式三剑客之——awk命令
目录
一.什么是awk
二.awk的语法格式
1.选项
2. 模式(Pattern)
3. 操作(Action)
4. 输入文件(file)
5.总结
三.awk的工作原理
1. 逐行扫描输入
2. 匹配模式
1.正则表达式:
2.逻辑表达式:
3.特殊模式:
3. 执行操作
打印:
计算:
修改字段:
4. 内置变量
5. 工作流程
四 练习
4.1 awk命令基础部分
4.2awk命令高级部分
一.什么是awk
awk
是一种模式扫描和处理语言,其核心思想是:
- 逐行扫描输入:
awk
会逐行读取输入文件或数据流。 - 匹配模式:通过定义模式(可以是正则表达式或逻辑条件)来匹配特定的行。
- 执行操作:对匹配的行执行指定的操作(如打印、计算、修改等)。
二.awk的语法格式
awk
命令主要由 模式(Pattern) 和 操作(Action) 组成,其基本语法如下:
awk [选项] 'pattern { action }' file
1.选项
-
-F 定义字段分隔符,默认分隔符是空格或制表符
-
-v 定义变量并赋值
-
-f 指定文件里的命令来处理文件
2. 模式(Pattern)
模式用于匹配输入行,决定是否执行操作。模式可以是以下类型:
正则表达式:
- 使用
/pattern/
匹配包含特定模式的行。 - 示例:
awk '/error/ { print }' file.txt # 打印包含 "error" 的行
逻辑表达式:
- 使用比较运算符(如
==
、>
、<
等)匹配满足条件的行。 - 示例:
awk '$1 > 10 { print }' file.txt # 打印第一个字段大于 10 的行
特殊模式:
BEGIN
:在处理输入之前执行的操作。END
:在处理完所有输入后执行的操作。- 示例:
awk 'BEGIN { print "Start" } { print } END { print "End" }' file.txt
空模式:
- 如果模式为空,则默认匹配所有行。
- 示例:
awk '{ print }' file.txt # 打印所有行
3. 操作(Action)
操作是当模式匹配时执行的代码块,用
{}
包围。操作可以是以下内容:
打印:
- 使用
print
或printf
输出内容。 - 示例:
awk '{ print $1 }' file.txt # 打印每行的第一个字段
计算:
- 对字段或变量进行数学运算。
- 示例:
awk '{ sum += $1 } END { print sum }' file.txt # 计算第一列的总和
修改字段:
- 直接修改字段的值。
- 示例
awk '{ $1 = "new_value"; print }' file.txt # 将第一列替换为 "new_value"
4. 输入文件(file)
awk
命令可以处理一个或多个文件。如果未指定文件,则从标准输入读取数据。
5.总结
awk
命令的完整结构:
awk [选项] 'BEGIN { initialization } pattern { action } END { finalization }' file
BEGIN
块:在处理输入之前执行,通常用于初始化变量或打印标题。
END
块:在处理完所有输入后执行,通常用于输出统计结果或总结。
再次强调:awk
命令的结构由 模式 和 操作 组成,支持 BEGIN
和 END
块进行初始化和收尾工作。
三.awk的工作原理
1. 逐行扫描输入
awk 会逐行读取输入文件或数据流(如果没有指定文件,则从标准输入读取)。对于每一行,awk 会执行以下步骤:
- 将当前行存储在内部变量
$0
中。 - 根据字段分隔符(默认是空格或制表符)将行分割为多个字段,分别存储在
$1
、$2
、$3
等变量中。 - 更新内置变量(如
NR
表示当前行号,NF
表示当前行的字段数)。
2. 匹配模式
awk
支持多种模式匹配方式:
1.正则表达式:
-
使用
/pattern/
来匹配包含特定模式的行。 -
示例
awk '/error/ { print }' file.txt # 打印包含 "error" 的行
2.逻辑表达式:
- 使用比较运算符(如
==
、>
、<
等)来匹配满足条件的行。 - 示例:
awk '$1 > 10 { print }' file.txt # 打印第一个字段大于 10 的行
3.特殊模式:
BEGIN
:在处理输入之前执行的操作。END
:在处理完所有输入后执行的操作。- 示例
awk 'BEGIN { print "Start" } { print } END { print "End" }' file.txt
3. 执行操作
当模式匹配时,awk
会执行相应的操作。操作可以是:
打印:
- 使用
print
或printf
输出内容。 - 示例
awk '{ print $1 }' file.txt # 打印每行的第一个字段
计算:
- 对字段或变量进行数学运算。
- 示例:
awk '{ sum += $1 } END { print sum }' file.txt # 计算第一列的总和
修改字段:
- 直接修改字段的值。
- 示例:
awk '{ $1 = "new_value"; print }' file.txt # 将第一列替换为 "new_value"
4. 内置变量
awk
提供了许多内置变量,用于控制和处理数据:
变量 | 描述 |
---|---|
NR | 当前处理的行号(从 1 开始)。 |
NF | 当前行的字段数。 |
FS | 字段分隔符(默认是空格或制表符)。 |
OFS | 输出字段分隔符(默认是空格)。 |
RS | 记录分隔符(默认是换行符)。 |
ORS | 输出记录分隔符(默认是换行符)。 |
FILENAME | 当前处理的文件名 |
$0 | 当前处理的行的整行内容 |
$n | 当前处理行的第n个字段(第n列) |
5. 工作流程
综上:awk
的工作流程可以总结为以下步骤:
- 初始化:
- 执行
BEGIN
块中的操作(如果有)。
- 执行
- 逐行处理:
- 读取每一行,更新内置变量(如
NR
、NF
等)。 - 检查是否匹配模式,如果匹配则执行操作。
- 读取每一行,更新内置变量(如
- 结束处理:
- 执行
END
块中的操作(如果有)。
- 执行
四 练习
4.1 awk命令基础部分
[root@localhost ~]# cat /etc/passwd | head -10 > zz
#以这条命令为前提执行如下命令1.逐条打印zz文件的内容
awk '{print}' zz2.逐条打印zz文件的每一行的第一个字段(默认以空格或制表符分隔)。
awk '{print $1}' zz3.以 : 作为字段分隔符,打印 zz 文件中每一行的第 5 个字段。
awk -F:'{print $1}' /etc/passwd4.以 x 作为字段分隔符,打印 /etc/passwd 文件中每一行的第一个字段。
awk -Fx '{print $1}' /etc/passwd5.打印 zz 文件中每一行的第一个和第二个字段(默认以空格或制表符分隔),并将它们连接在一起。
awk '{print $1 $2}' zz6.打印 zz 文件中每一行的第一个和第二个字段(默认以空格或制表符分隔),并在它们之间插入一个空格。
awk '{print $1" "$2}' zz
或
awk '{print $1,$2}' zz7.打印 zz 文件中每一行的第一个和第二个字段(默认以空格或制表符分隔),用制表符作为分隔符输出。
awk -F: '{print $1"\t"$2}' zz8.打印包含root的整行内容
awk -F: '/root/{print $0}' zz 9.打印包含root的行的第一列
awk -F: '/root/{print $1}' zz10.以:或/作为字段分隔符,计算并输出zz文件中每一行的字段数量
awk -F[:/] '{print NF}' zz11.以:或/作为字段分隔符,逐行处理zz文件,并输出当前行的行号
awk -F[:/] '{print NR}' zz12.打印 /etc/passwd 文件的第二行。
awk 'NR==2' /etc/passwd
或awk 'NR==2{print}' /etc/passwd13.以:为分隔符,打印/etc/passwd文件第二行的第一列。
awk -F: 'NR==2{print $1}' /etc/passwd14. 打印最后一列
awk -F: '{print $NF}' /etc/passwd15.在文件处理结束后,打印文件的总行数。
awk 'END{print NR}' /etc/passwd16.在文件处理结束后,打印文件的最后一行。
awk 'END{print $0}' /etc/passwd17.以:为分隔符,打印/etc/passwd文件的每一行有几列。
awk -F: '{print "第"NR"行有"NF"列"}' /etc/passwd
1.查看本机IP地址
ifconfig ens33 | awk '/netmask/{print "本机的ip地址是"$2}'2.根分区的可用量
df -h | awk 'NR==2{print $4}'3.BEGIN块的一些注意事项:
(1)BEGIN块在处理文件之前执行,因此不需要指定文件名
运行awk 'BEGIN{x=10;print x+1}' 会直接输出结果11
如果没有BEGIN块:运行awk '{x=10; print x+1}' filename ;这条命令会逐行处理filename文件,并对每一行执行 {x=10; print x+1}。(2)不指定初始值,初始值就为0,如果是字符串,则默认为空awk 'BEGIN{print x+1}' 输出为1
小数也可以运算 awk 'BEGIN{print 2.5+3.5}' 输出为6
^和**都是幂运算 awk 'BEGIN{print 2^3}' awk 'BEGIN{print 2**3}' 输出都是84. awk -F: '/root/' /etc/passwd
在awk中,如果省略 print,默认行为是打印整行(即 print $0)。5.用~表示包含,!~表示不包含
注意~和!~是模糊匹配(用于在不完全精确匹配的情况下,找到与目标最相似的结果)例1:awk -F: '$1~/ro/' /etc/passwd
#模糊匹配,只要有ro就匹配上
例2:awk -F: '$7!~/nologin$/{print $1,$7}' /etc/passwd
#从/etc/passwd文件中提取用户的登录名($1)和登录Shell($7),但只选择那些登录Shell不以nologin结尾的行。
内置变量的用法
1.awk 'BEGIN{FS=":";OFS="---"}{print $1,$2}' pass.txt
#OFS定义了输出时以什么分隔,$1$2中间要用逗号分隔,因为逗号默认被映射为OFS变量,而这个变量默认是空格
输出结果为:
root---x
bin---x
daemon---x
adm---x
lp---x2.awk 'BEGIN{RS=":"}{print $0}' /etc/passwd
#RS:指定以什么为换行符,这里指定是冒号,你指定的必须是原文里存在的字符3.awk 'BEGIN{ORS=" "}{print $0}' /etc/passwd
#将/etc/passwd文件中的每一行连接起来,并用空格作为分隔符输出。
4.2awk命令高级部分
awk与if语句结合
例1:简单条件判断
假设有一个文件 data.txt,内容如下:
10
20
30
40
50
要求:如果某行的值大于 30,则打印该行。awk '{if ($1 > 30) print $0}' data.txt
要求:只打印奇数行。 awk '{if (NR % 2 == 1) print $0}' data.txt例2:多条件判断
假设有一个文件 users.txt,内容如下:
Alice 25
Bob 30
Charlie 15
David 40
要求:如果年龄大于 20 且小于 40,则打印用户名。
awk '{if ($2 > 20 && $2 < 40) print $1}' users.txt要求:根据分数打印等级:
大于等于 90:A
大于等于 80:B
大于等于 60:C
其他:Dawk '{if ($2 >= 90) {print $1, "A"} else if ($2 >= 80) {print $1, "B"} else if ($2 >= 60) {print $1, "C"} else {print $1, "D"}
}' scores.txt例3:结合正则表达式
假设有一个文件 emails.txt,内容如下:
alice@example.com
bob@gmail.com
charlie@example.org
david@yahoo.com
要求:如果邮箱地址以 @example.com 结尾,则打印该邮箱。
awk '{if ($0 ~ /@example\.com$/) print $0}' emails.txtawk还支持for循环、while循环、函数、数组等
awk高级用法
1.统计 /etc/passwd 文件中以 /bin/bash 结尾的行数,并输出这些行及其编号,最后输出总行数。
awk 'BEGIN{x=0};/\/bin\/bash$/ {x++;print x,$0};END {print x}' /etc/passwd2.输出/etc/passwd文件第3个字段的值不小于200的行
awk -F ":" '! ($3<200){print} ' /etc/passwd3.从/etc/passwd文件中提取每一行的第3个字段(用户 ID)和第4个字段(组 ID),比较它们的值,输出较大的那个值。
awk -F ":" ' {max=($3>=$4) ?$3:$4; {print max}} ' /etc/passwd注意:($3>=$4) ?$3:$4:这是一个三元运算符,用于比较 $3 和 $4 的值:
如果 $3 大于或等于 $4,则返回 $3。
否则,返回 $4。4.逐行读取 /etc/passwd 文件,并在每一行的前面加上行号(NR),然后输出整行内容。
awk -F ":" '{print NR,$0}' /etc/passwd5.输出以冒号分隔且第7个字段中包含/bash的行的第1个字段
awk -F ":" '$7~"bash"{print $1,47}' /etc/passwd6.从 /etc/passwd 文件中提取第1个字段中包含root且有7个字段的行,并输出该行的第1个字段第2个字段和最后一个字段。
awk -F":"'($1~"root") && (NF==7) {print $1,$2,$NF } ' /etc/passwd7.输出/etc/passwd 文件中第7个字段既不为/bin/bash,也不为/sbin/nologin的所有行
awk -F ":”'($7!="/bin/bash")&&($7!="/sbin/nologin"){print} ' /etc/passwd8.查看当前内存使用百分比
free -m |awk '/Mem:/ {print int($3/($3+$4)*100)"%"}'9.统计使用bash 的用户个数
awk -F: '/bash$/ {print}'passwd | wc -l
或
awk -F: '/bash$/{print | "wc -l"}' /etc/passwd10.查看当前CPU空闲率
top -b -n 1 | grep Cpu | awk -F ',' '{print $4}'| awk '{print $1}'
(-b -n 1表示只需要1次的输出结果)11.从 /var/log/secure 日志文件中提取所有失败的 SSH 登录尝试,并统计每个 IP 地址的失败次数。
awk 'BEGIN {ip[$11]=0}; /Failed password/ {ip[$11]++}; END {for(i in ip) {print i" , "ip[i]}}' /var/log/secure
面试题:
找到10:00 到 11:00 之间的日志
awk '$3 >= "10:00:00" && $3 <= "11:00:00"' /var/log/messages
相关文章:
正则表达式三剑客之——awk命令
目录 一.什么是awk 二.awk的语法格式 1.选项 2. 模式(Pattern) 3. 操作(Action) 4. 输入文件(file) 5.总结 三.awk的工作原理 1. 逐行扫描输入 2. 匹配模式 1.正则表达式: 2.逻辑…...

BeeWorks Meet:私有化部署视频会议的高效选择
在数字化时代,视频会议已成为企业沟通协作的重要工具。然而,对于金融、政务、医疗等对数据安全和隐私保护要求极高的行业来说,传统的公有云视频会议解决方案往往难以满足其严格的安全标准。此时,BeeWorks Meet 私有化部署视频会议…...
[Mybatis-plus]
简介 MyBatis-Plus (简称 MP)是一个 MyBatis的增强工具,在 MyBatis 的基础上只做增强不做改变。Mybatis-plus官网地址 注意,在引入了mybatis-plus之后,不要再额外引入mybatis和mybatis-spring,避免因为版本…...

IPv6 技术细节 | 源 IP 地址选择 / Anycast / 地址自动配置 / 地址聚类分配
注:本文为 “IPv6 技术细节” 相关文章合集。 部分文章中提到的其他文章,一并引入。 略作重排,未整理去重。 如有内容异常,请看原文。 闲谈 IPv6 - 典型特征的一些技术细节 iteye_21199 于 2012-11-10 20:54:00 发布 0. 巨大的…...
【高频考点精讲】ES6 String的新增方法,处理字符串更方便了
ES6 String的新增方法:处理字符串从未如此优雅 【初级】前端开发工程师面试100题(一) 【初级】前端开发工程师面试100题(二) 【初级】前端开发工程师的面试100题(速记版) 作为天天和字符串打交道的码农,谁还没被indexOf和substring折磨过?ES6给String对象新增的几个方…...

【工具】使用 MCP Inspector 调试服务的完全指南
Model Context Protocol (MCP) Inspector 是一个交互式开发工具,专为测试和调试 MCP 服务器而设计。本文将详细介绍如何使用 Inspector 工具有效地调试和测试 MCP 服务。 1. MCP Inspector 简介 MCP Inspector 提供了直观的界面,让开发者能够ÿ…...

【音视频】AVIO输入模式
内存IO模式 AVIOContext *avio_alloc_context( unsigned char *buffer, int buffer_size, int write_flag, void *opaque, int (*read_packet)(void *opaque, uint8_t *buf, int buf_size), int (*write_packet)(void *opaque, uint8_t *buf, int buf_size), int64_t (*seek)(…...
AI与思维模型【76】——SWOT思维模型
一、定义 SWOT思维模型是一种用于分析事物内部和外部因素的战略规划工具。其中,S代表优势(Strengths),是指事物自身所具备的独特能力、资源或特点,这些因素有助于其在竞争中取得优势;W代表劣势(…...
大模型提示词如何编写
一、提示词的核心三要素 明确目标(What) 告诉 AI「你要它做什么」,越具体越好。 ❌ 模糊:写一篇文章 ✅ 清晰:写一篇 800 字的高考作文,主题 “坚持与创新”,结构分引言、三个论点(…...
python如何取消word中的缩进
在python-docx中,取消缩进可以通过将相应的缩进属性设置为None或0来实现。以下是取消不同类型缩进的方法: 取消左缩进 from docx import Documentdoc Document(existing_document.docx)for paragraph in doc.paragraphs:# 取消左缩进paragraph.paragr…...
DDL小练习
1.创建一张t_user表 要求属性有id(INT),name(VARCHAR),sex(VARCHAR),birthday(DATE) 其中id和name不能为空,添加数据并测试。 创建数据库 create database spt2503; 创建数据库中的t_user表 create table t_user (id int not null, name varchar(20) not…...

Uniapp:scroll-view(区域滑动视图)
目录 一、基本概述二、属性说明三、基本使用3.1 纵向滚动3.2 横向滚动一、基本概述 scroll-view,可滚动视图区域。用于区域滚动。 二、属性说明 属性名类型默认值说明平台差异说明scroll-xBooleanfalse允许横向滚动scroll-yBooleanfalse允许纵向滚动三、基本使用 3.1 纵向滚…...
【前端】【面试】在前端开发中,如何实现图片的渐进式加载,以及这样做的好处是什么?
题目:在前端开发中,如何实现图片的渐进式加载,以及这样做的好处是什么? 在浏览器端实现图片的“渐进式加载”(Progressive Image Loading)常用的三种方式 方法思路典型实现要点适用场景优缺点简述1. 使…...

单精度浮点运算/定点运算下 MATLAB (VS) VIVADO
VIVADO中单精度浮点数IP核计算结果与MATLAB单精度浮点数计算结果的对比 MATLAB定点运算仿真,对比VIVADO计算的结果 目录 前言 一、VIVADO与MATLAB单精度浮点数运算结果对比 二、MATLAB定点运算仿真 总结 前言 本文介绍了怎么在MATLAB中使用单精度浮点数进行运算…...
基于大模型对先天性巨结肠全流程预测及医疗方案研究报告
目录 一、引言 1.1 研究背景与意义 1.2 研究目的与创新点 二、大模型在先天性巨结肠预测中的理论基础 2.1 大模型概述 2.2 大模型预测先天性巨结肠的可行性分析 三、术前预测与准备方案 3.1 大模型对术前病情的预测 3.1.1 疾病确诊预测 3.1.2 病情严重程度评估 3.2 …...

【AI插件开发】Notepad++ AI插件开发1.0发布和使用说明
一、产品简介 AiCoder是一款为Notepad设计的轻量级AI辅助插件,提供以下核心功能: 嵌入式提问:对选中的文本内容进行AI分析,通过侧边栏聊天界面与AI交互,实现多轮对话、问题解答或代码生成。对话式提问:独…...

【MySQL数据库入门到精通-07 函数-字符串函数、数值函数、日期函数和流程函数】
文章目录 一、字符串函数1. MySQL中的函数主要分为以下四类: 字符串函数、数值函数、日期函数、流程函数。下面是字符串函数常见的函数,见下表。2.具体代码实现3.结果 二、数值函数1.知识点2.具体代码实现3.结果 三、日期函数1.知识点2.具体代码实现3.结…...

Python图像处理——基于Retinex算法的低光照图像增强系统
1.项目内容 (1)算法介绍 ①MSRCR (Multi-Scale Retinex with Color Restoration) MSRCR 是多尺度 Retinex 算法(MSR)的扩展版,引入了色彩恢复机制以进一步提升图像增强质量。MSR 能有效地压缩图像动态范围ÿ…...

如何在JDK17项目中改成1.8
1.调整 Spring Boot 版本 由于 Spring Boot 3.x 最低要求 JDK 17,所以如果要使用 JDK 8,需要把 spring-boot-starter-parent 的版本降低到 2.7.x 系列,这个系列是支持 JDK 8 的。示例如下: <parent><groupId>org.sp…...

【不同名字的yolo的yaml文件名是什么意思】
以下是这些 YOLO 系列配置文件的详细解析,按版本和功能分类说明: 一、YOLOv3 系列 文件名核心特性适用场景yolov3.yaml原始 YOLOv3 结构,3 尺度预测(13x13,26x26,52x52)通用目标检测yolov3-spp.yaml增加 SPPÿ…...

Zephyr kernel Build System (CMake)介绍
目录 概述 1. 结构介绍 2 构建和配置阶段 2.1 配置阶段 2.2 Cmake编译 3 Zephy项目目录结构 3.1 文件架构 3.2 文件content 概述 本文主要介绍Zephyr kernel Build System CMake的功能,以及使用该工具构建项目,并详细介绍了每个目录以及目录下文…...

相对论大师-记录型正负性质BFS/图论-链表/数据结构
看到这一题我的第一个思路就是双向bfs 起点是a,终点还是a,但是flag是相反的(“越”的方向) tip1.可以用字典vis来存储flag 刚开始初始化时vissta,visend一个对应0、1 要求两个队列相…...
研发内控新规下的合规之道:维拉工时助力企业穿越IPO审查雷区
📌 背景 | 全面注册制下,研发内控成“必修课” 在全面注册制背景下,证监会发布的《监管规则适用指引——发行类第9号:研发人员及研发投入》(简称“发行类9号”),对企业的研发费用归集、研发工时…...

Jenkins流水线管理工具
文章目录 前言: DevOps时代的自动化核心 —Jenkins一、Jenkins是什么?二、Linux安装Jenkinswar包方式安装依赖环境下载 Jenkins WAR 包启动 Jenkins 服务启动日志验证配置插件镜像源 docker镜像方式安装依赖环境拉取 Jenkins 镜像运行 Jenkins 容器获取初…...

嵌入式开发:基础知识介绍
一、嵌入式系统 1、介绍 以提高对象体系智能性、控制力和人机交互能力为目的,通过相互作用和内在指标评价的,嵌入到对象体系中的专用计算机系统。 2、分类 按其形态的差异,一般可将嵌入式系统分为:芯片级(MCU、SoC&am…...

el-table中el-input的autofocus无法自动聚焦的解决方案
需求 有一个表格展示了一些进度信息,进度信息可以修改,需要点击进度信息旁边的编辑按钮时,把进度变为输入框且自动聚焦,当鼠标失去焦点时自动请求更新接口。 注:本例以vue2 element UI为例 分析 这个需求看着挺简单…...

一文了解智慧教育顶刊TLT的研究热点
本文聚焦于IEEE Transactions on Learning Technologies(TLT)期刊,通过图文结合的方式,梳理了2025年第18卷的研究热点,帮助读者把握教育技术与人工智能交叉领域的研究进展,深入了解智能学习系统、自适应学习…...

统计术语学习
基期、现期 作为对比参照的时期称为基期,而相对于基期的称为现期。 描述具体数值时我们称之为基期量和现期量。 【例 1】2017 年比 2016 年第三产业 GDP 增长 6.8%, (2016)为基期,(2017) 为现…...
NEGATIVE LABEL GUIDED OOD DETECTION WITH PRETRAINED VISION-LANGUAGE MODELS
1. 介绍: 这篇论文也是基于CLIP通过后处理的方法实现的OOD的检测,但是设计点在于,之前的方法是使用的ID的类别,这篇工作是通过添加一些在语义上非常不同于ID的类别的外分布类来做的OOD检测。 CLIP做OOD检测的这个系列里面我看的以及记录的第一篇就是MCM的方法,这也是确实是…...

飞机会员日
各航空公司会员日日期 主要航空公司会员日整理如下(数据截至2025年3月最新信息): 1 2 中国国际航空(国航) 每月"同月同日"(如1月1日、2月2日类推) 中国南方航空(…...