高级玩法,匹配模式进行文件内容提取awk

#基本介绍
awk是一种强大的文本处理工具,在 Linux 和 Unix 系统中广泛使用,可用于数据提取、格式化、统计分析
等多种场景。

 
awk会逐行读取文件内容,将每一行看作一个独立的处理单元。就像把文件整体打碎成一行一行的 “碎片”。接
着,针对每一行,awk会根据指定的字段分隔符(默认是空格或制表符),把行内容进一步分割成多个字段,这
类似于把每一行 “碎片” 又拆分成更小的 “碎片”。
 

例如,有一个名为students.txt的文件,内容如下: 
[root@xzq-almalinux ~]# cat student.txt 
Alice 20 Math
Bob 22 English
Charlie 21 History 


awk在处理这个文件时,会逐行读取,对于第一行Alice 20 Math,以空格为分隔符,将其分割成三个字段
Alice、20、Math。
 
awk可以根据需求输出想要的对应碎片的内容,具体是通过模式匹配与动作执行来实现的。awk允许用户通过定
义模式和动作来筛选和处理这些 “碎片”。模式用于指定要处理的行,动作则定义了对符合模式的行要执行的操
作。

 
示例:只输出年龄大于 20 的学生信息
[root@xzq-almalinux ~]# awk '$2 >20 {print $0}' student.txt
Bob 22 English
Charlie 21 History

 
这里$2 > 20是模式,用于筛选出第二个字段(年龄)大于 20 的行;{print $0}是动作,用于打印符合条
件的整行内容。执行该命令后,输出结果为:
 
#基本语法
awk '模式 {动作}' 文件

 
模式:用于筛选符合条件的行,可使用正则表达式、比较表达式等,省略模式时默认处理所有行。
动作:对符合模式的行执行的操作,通常用花括号括起来,可包含变量赋值、输出语句等。

#内置变量
$0:代表当前处理的整行内容。
$n:n为正整数,$n表示当前行的第n个字段,例如$1是第一个字段,$2是第二个字段。
NF:表示当前行的字段数量。
NR:表示当前处理的行号。
FS:输入字段分隔符,默认是空格或制表符,可通过-F选项或在awk脚本中设置修改。
 
#常见模式
正则表达式模式:用 /正则表达式/ 表示,匹配包含该正则表达式的行。

#awk比较操作符模式
awk 也支持使用比较操作符来定义模式,比如相等(==)、不等(!=)、大于(>)、小于(<)、大于等于
(>=)和小于等于(<=)。
比较表达式模式:如 $1 > 10,表示第一个字段大于 10 的行。
范围模式:如 NR == 1, NR == 5,表示处理第 1 行到第 5 行。

#awk复合模式
复合模式允许用户将多个模式结合起来,使用逻辑操作符 &&(逻辑与)、||(逻辑或)以及 !(逻辑非)。
 
#创建动作
print:是一个简单直接的输出命令,主要用于将变量、字段或字符串等内容输出到标准输出。它会自动在每个
输出项之间添加输出字段分隔符(由OFS变量控制,默认是空格),并在每行输出的末尾添加输出记录分隔符
(由ORS变量控制,默认是换行符)。 
 printf:是格式化输出命令,类似于 C 语言中的printf函数。它允许你按照指定的格式输出内容,提供了更
精细的输出控制,包括字段宽度、精度、对齐方式等。
 

awk使用示例
[root@xzq-almalinux ~]# cat student.txt 
Alice 20 Math
Bob 22 English
Charlie 21 History
[root@xzq-almalinux ~]# awk '{print}' student.txt 
Alice 20 Math
Bob 22 English
Charlie 21 History
[root@xzq-almalinux ~]# awk '{print $0}' student.txt 
Alice 20 Math
Bob 22 English
Charlie 21 History

 
在 awk 中,{print}、{print $0} 这两种写法效果是完全一样的,都是打印当前行的完整内容。
这是因为:

$0 是 awk 中的一个特殊变量,表示当前处理的整行内容
当 print 命令后面没有指定具体内容时,默认就会打印 $0 的值
 
2.输出指定行 
NR:表示当前处理的行号。
[root@xzq-almalinux ~]# awk 'NR==3 {print $0}' student.txt 
Charlie 21 History
[root@xzq-almalinux ~]# awk 'NR==2,NR=3' student.txt 
Bob 22 English
[root@xzq-almalinux ~]# awk 'NR==2,NR==3' student.txt 
Bob 22 English
Charlie 21 History
 
3.awk通过分隔符,输出指定列
[root@xzq-almalinux ~]# cat student-new.txt 
Alice:20:Math:85
Bob:22:English:95
Charlie:21:History:70
x1:25:LINUX:95
x2:40:linux:80
 
#以:为分隔符,打印第三行,第四行
[root@xzq-almalinux ~]# awk -F ":" '{ print $3,$4 }' student-new.txt
Math 85
English 95
History 70
LINUX 95
linux 80

[root@xzq-almalinux ~]# awk -F ":" '{ print "第三列:\t "$3 "  \t第四列:\t "$4 }' student-new.txt
第三列:  Math   第四列:  85
第三列:  English        第四列:  95
第三列:  History        第四列:  70
第三列:  LINUX          第四列:  95
第三列:  linux          第四列:  80
  使用:作为字段分隔符
  打印 "第三列:"+ 制表符 + 第三列内容
  再加上 "第四列:"+ 制表符 + 第四列内容
  各列之间用制表符 (\t) 分隔,使输出更整齐
 

#awk输出最后一列
[root@xzq-almalinux ~]# awk '{print $NF}' student-new.txt 
Alice:20:Math:85
Bob:22:English:95
Charlie:21:History:70
x1:25:LINUX:95
x2:40:linux:80
[root@xzq-almalinux ~]# awk -F':' '{print $NF}' student-new.txt 
85
95
70
95
80 

4.awk消除空白行
[root@xzq-almalinux ~]# cat student.txt 
Alice 20 Math

Bob 22 English


Charlie 21 History 
[root@xzq-almalinux ~]# awk NF student.txt
Alice 20 Math
Bob 22 English
Charlie 21 History 
 
5.awk输出前N列 
#以:作为分隔符,输出前面2列
[root@xzq-almalinux ~]# cat student-new.txt 
Alice:20:Math:85
Bob:22:English:95
Charlie:21:History:70
x1:25:LINUX:95
x2:40:linux:80
[root@xzq-almalinux ~]# awk  -F ":" 'NF=2' student-new.txt
Alice 20
Bob 22
Charlie 21
x1 25
x2 40
 
#条件判断和计算复合模式的awk示例
[root@xzq-almalinux ~]# cat data.txt 
Alice 80 90 70
Bob 60 70 80
Charlie 90 95 92
susan 100 80  61
[root@xzq-almalinux ~]# awk '{sum = $2 + $3 + $4; avg = sum / 3; if (avg > 80)print $1, avg}' data.txt
Charlie 92.3333
susan 80.3333

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值