目录
一、概述
二、基本语法
1、awk 命令的基本语法
2、常用选项
3、获取帮助
三、工作原理
四、 功能特点
五、分割字段
六、 示例
1. 打印所有行
2. 计算总和
3. 过滤特定模式
4. 使用多个模式
5. 复杂的脚本
6. 自定义分隔符
7. 打印指定列
8. 使用 BEGIN 和 END 块
9. 内置变量
10. 使用外部变量
11. 复杂的条件表达式
七、进阶用法
1、记录匹配
2、数组
3、函数
一、概述
awk
是 Linux 和 Unix 系统上一个非常强大的文本处理工具,它能够对文本和数据进行复杂的处理和分析。awk
的名称来源于其三位创始人的名字首字母:Alfred Aho、Peter Weinberger 和 Brian Kernighan。最初为 Unix 系统设计,后来被移植到包括 Linux 在内的多种操作系统中。它非常适合用于格式化输出、数据提取和简单的报告生成任务。
awk
设计之初是为了在文本文件中查找和替换文本,但它现在已经发展成为一个完整的编程语言,能够进行模式匹配和复杂的文本处理。
二、基本语法
1、awk 命令的基本语法
Awk [options] 'pattern {action}' [filename]
- pattern: 用于匹配输入行中的模式。可以是正则表达式、条件表达式或布尔表达式。
- {action}: 当模式匹配成功时,需要执行的命令或语句,可以是内置的 awk 命令,也可以是自定义的代码块。
- [filename]: 指定要处理的文件名。如果省略,则默认从标准输入读取。
2、常用选项
如下为常用选项:
- -F fs 或 --field-separator=fs: 设置字段分隔符。
- -v var=val 或 --assign=var=val: 定义变量及其初始值。
- -f script-file 或 --file=script-file: 从文件中读取 awk 脚本。
- -i inplace 或 --inplace: 直接在原文件上修改。
- -n 或 --non-decimal-data: 允许非十进制数被识别。
- -W interactive 或 --interactive: 以交互模式运行。
3、获取帮助
在命令行中输入指令:
awk -h
出现如下图所示的帮助信息:
三、工作原理
awk 按行处理文本文件,默认使用空格作为字段分隔符,将每一行分割成多个字段,并使用 $1, $2, … $n 来引用这些字段。其中 $0 代表整行文本。
四、 功能特点
awk具有很多功能,主要有如下特点:
1. 模式匹配: awk 可以根据指定的模式来选择处理哪些行。
2. 字段分割: 输入行可以按照分隔符自动分割成多个字段。
3. 变量: awk 支持变量的定义和使用。
4. 流程控制: 包括条件语句(如 if, else)和循环语句(如 for, while)。
5. 数学函数和字符串函数: 提供了丰富的内置函数支持数学运算和字符串操作。
6. 用户自定义函数: 用户可以定义自己的函数以扩展 awk 的功能。
五、分割字段
awk 默认使用空格作为字段分隔符,但可以通过 -F 或 --field-separator 选项指定其他字符:
awk -F: '{print $1}' /etc/passwd
这会打印 /etc/passwd 文件中每个条目的第一个字段(用户名),其中字段是以冒号 : 分隔的。如下所示:
[root@ecs-52a1 /]# awk -F: '{print $1}' /etc/passwd
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
operator
games
ftp
nobody
systemd-network
dbus
polkitd
postfix
sshd
chrony
tcpdump
[root@ecs-52a1 /]#
六、 示例
1. 打印所有行
awk '{print}' file.txt
2. 计算总和
awk '{sum += $1} END {print sum}' numbers.txt
3. 过滤特定模式
awk '/pattern/ {print}' file.txt
4. 使用多个模式
awk '/pattern1/ || /pattern2/ {print}' file.txt
5. 复杂的脚本
如下为脚本代码:
awk '
BEGIN {print "Start of the file"}
/pattern1/ {print "Found pattern1"}
/pattern2/ {print "Found pattern2"}
END {print "End of the file"}
' file.txt
6. 自定义分隔符
awk -F, '{print $1, $3}' data.csv
7. 打印指定列
假设文件 data.txt 内容如下:
Name Age City
John 30 New York
Doe 25 Los Angeles
要打印每行的第二列(即年龄),使用如下命令:
awk '{print $2}' data.txt
输出:
Age
30
25
注意,$0 表示整行,$1 表示第一列,以此类推。
实际操作如下图:
8. 使用 BEGIN 和 END 块
BEGIN 块在读取任何输入行之前执行,END 块在读取完所有输入行之后执行。
awk 'BEGIN {print "Start"} {print} END {print "End"}' filename
9. 内置变量
awk 有许多内置变量,如 NR(当前记录号,即行号)、NF(当前记录的字段数,即每行的列数)等。
打印每行的行号和每行的字段数:
awk '{print NR, $0, NF}' filename
10. 使用外部变量
可以在 awk 命令中通过 -v 选项设置外部变量。
awk -v var="Hello" 'BEGIN {print var}'
11. 复杂的条件表达式
awk 支持复杂的条件表达式,包括正则表达式匹配。
awk '/John/ {print $0}' filename
这会打印所有包含 "John" 的行。
七、进阶用法
1、记录匹配
使用 NR 记录总数,FNR 当前文件的记录数。
可以使用如下命令记录文件的行数
awk 'END{print NR}' file.txt
2、数组
可以使用数组存储和处理数据,可以进行复杂的数据处理。
awk '{name[$1] = $2} END {for (i in name) print i, name[i]}' filename
这个命令会创建一个以名字为键,年龄为值的数组,并在结束时遍历并打印它。
3、函数
可以定义和调用用户自定义函数。
文章正下方可以看到我的联系方式:鼠标“点击” 下面的 “威迪斯特-就是video system 微信名片”字样,就会出现我的二维码,欢迎沟通探讨。