awk
是一个强大的文本处理工具,用于在 Unix 和类 Unix 操作系统中进行模式扫描和处理。awk
能够从输入文件中读取数据,并对这些数据进行复杂的文本处理。
以下是 awk
的一些主要特性:
-
模式匹配:
awk
可以搜索特定的模式,并在找到匹配行时执行相应的操作。 -
字段处理:
awk
能够识别输入行中的字段(默认由空格分隔),并允许用户通过$1
、$2
等变量访问这些字段。 -
内置变量:
awk
提供了一系列内置变量,如NF
(当前行的字段数)、NR
(已处理的记录数)等。 -
编程能力:
awk
支持变量赋值、算术运算、逻辑运算、控制结构(如 if-else、while、for 循环)等,使其成为一种完整的编程语言。 -
正则表达式:
awk
支持使用正则表达式进行模式匹配。 -
多行模式:
awk
可以处理多行模式,允许用户对多行文本进行操作。 -
用户定义函数:
awk
允许用户定义自己的函数,以复用代码和提高处理效率。 -
模式-动作对:
awk
的核心是模式-动作对,其中模式指定要匹配的文本,动作是在找到匹配时执行的命令。 -
跨平台:
awk
同样被移植到了多种操作系统,包括 Windows。
awk
命令的基本语法如下:
awk 'pattern { actions }' file
或者
awk -Fdelimiter 'pattern { actions }' file
其中 -Fdelimiter
用于指定字段分隔符,pattern
是要搜索的模式,actions
是在找到匹配时执行的一系列命令,file
是要处理的文件。
一些常见的 awk
用法示例:
-
打印第二列:
awk '{print $2}' file
-
计算行数:
awk 'END {print NR}' file
-
按行处理:
awk '{sum += $1} END {print sum}' file
-
条件打印:
awk '$3 > 100 {print $1, $3}' file
-
使用正则表达式:
awk '/^Error/ {print $0}' file
-
自定义分隔符:
awk -F: '{print $1}' /etc/passwd
awk
提供了一系列内置变量,这些变量可以用来控制 awk
的行为或存储关于当前处理的数据的信息。以下是一些常用的 awk
内置变量:
-
$0:整个当前记录,即当前行。
-
$1, $2, …, $NF:当前记录的字段,其中
$1
是第一个字段,$2
是第二个字段,以此类推,$NF
是最后一个字段。 -
NF:当前记录中的字段总数。
-
NR:已经处理的记录总数(行数)。
-
FNR:当前文件的记录数(行数)。当处理多个文件时,每个文件的
FNR
都是独立的。 -
FS:字段分隔符,默认为空格或制表符。
-
OFS:输出字段分隔符,默认与
FS
相同。 -
RS:记录分隔符,默认为换行符。
-
ORS:输出记录分隔符,默认与
RS
相同。 -
FILENAME:当前处理的文件名。
-
ARGC:命令行参数的数量。
-
ARGV:命令行参数的数组。
-
ENVIRON:环境变量的数组。
练习题
练习 1:打印文件中每行的第二个字段
文件内容 (data.txt
):
apple 5 banana
orange 10 mango
grape 7 cherry
命令:
awk '{print $2}' data.txt
预期结果:
5
10
7
练习 2:计算文件中包含某个单词的行数
文件内容 (data.txt
):
apple
banana
apple
cherry
apple
命令:
awk '/apple/ {count++} END {print count}' data.txt
预期结果:
3
练习 3:将文件中的字段以逗号分隔符输出
文件内容 (data.txt
):
apple 5 banana
orange 10 mango
grape 7 cherry
命令:
awk '{printf "%s,%s,%s\n", $1, $2, $3}' data.txt
预期结果:
apple,5,banana
orange,10,mango
grape,7,cherry
练习 4:计算文件中每行第一个字段的总和
文件内容 (data.txt
):
1 2 3
4 5 6
7 8 9
命令:
awk '{sum += $1} END {print sum}' data.txt
预期结果:
12
练习 5:打印文件中每行最后一个字段
文件内容 (data.txt
):
apple 5 banana cherry
orange 10 mango cherry
grape 7 cherry berry
命令:
awk '{print $(NF)}' data.txt
预期结果:
cherry
cherry
berry
练习 6:打印文件中第二个字段大于5的行
文件内容 (data.txt
):
apple 3 banana
orange 10 mango
grape 7 cherry
pear 2 apple
命令:
awk '$2 > 5' data.txt
预期结果:
orange 10 mango
grape 7 cherry
练习 7:将文件中的字段分隔符设置为冒号,并打印第一个字段
文件内容 (data.txt
):
apple:5:banana
orange:10:mango
grape:7:cherry
命令:
awk -F: '{print $1}' data.txt
预期结果:
apple
orange
grape
#练习 8:计算文件中每个单词出现的次数
文件内容 (data.txt
):
apple banana apple cherry banana grape
命令:
awk '{for(i=1; i<=NF; i++) count[$i]++} END {for(word in count) print word, count[word]}' data.txt
预期结果:
apple 2
banana 2
cherry 1
grape 1
标签:apple,cherry,akw,文本处理,awk,Liunx,print,txt,data
From: https://blog.csdn.net/weixin_54799594/article/details/143850075