#基本介绍
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
1434

被折叠的 条评论
为什么被折叠?



