✨✨ 欢迎大家来到景天科技苑✨✨
???????? 养成好习惯,先赞后看哦~????????
???? 作者简介:景天科技苑
????《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,****全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。
????《博客》:Python全栈,PyQt5和Tkinter桌面应用开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,云原生K8S,数据分析,Django,fastapi,flask等框架,linux,shell脚本等实操经验,网站搭建,数据库等分享。所属的专栏:linux基础与进阶,shell脚本编写实战
景天的主页:景天科技苑
文章目录
- Shell脚本中awk的详细用法教程
- 引言
- 一、awk简介
- 1.1 awk的起源与特性
- 1.2 awk的工作原理
- 二、awk的基本语法
- 2.1 awk命令的基本格式
- 2.2 常用选项
- 2.3 内置变量
- 三、awk的常用用法
- 3.1 打印整行或特定字段
- 示例1:打印文件的所有行
- 示例2:打印文件的特定字段
- 3.2 根据条件筛选行
- 示例3:打印文件的第二行
- 示例4:打印包含特定字符串的行
- 3.3 自定义分隔符
- 示例5:以逗号分隔的字段
- 3.4 从文件中读取awk脚本
- 示例6:读取awk脚本文件
- 四、awk的高级特性
- 4.1 BEGIN和END模式
- 示例7:统计文件中的行数
- 4.2 数组和循环
- 示例8:统计文件中各字段的出现次数
- 4.3 内置函数
- 示例9:使用内置函数进行数学计算
- 示例10:字符串操作
- 4.4 多模式匹配
- 示例11:根据条件执行不同动作
- 4.5 用户自定义函数
- 示例12:定义并调用用户自定义函数
- 五、Shell脚本中awk的实际案例
- 5.1 案例1:处理日志文件
- 5.2 案例2:格式化CSV文件
- 5.3 案例3:计算文本文件的平均数
- 六、总结
Shell脚本中awk的详细用法教程
引言
在Linux和Unix系统中,awk
是一种强大的文本处理工具,广泛应用于数据提取、分析和报告生成。它基于模式匹配和条件执行,能够逐行读取输入文本文件,并对每行数据执行指定的操作。本教程将详细介绍awk
在shell脚本中的用法,包括其基本语法、常用选项、内置变量、高级特性以及结合shell脚本的实际案例。
一、awk简介
1.1 awk的起源与特性
awk
是由Alfred Aho、Peter Weinberger和Brian Kernighan三位科学家开发的,其名称来源于他们姓氏的首字母。awk
最初设计用于文本处理和数据格式化,其强大的数据处理能力使得它成为Linux/Unix系统中不可或缺的工具之一。
1.2 awk的工作原理
awk
通过读取输入文件(或标准输入),逐行进行处理。它默认以空格或Tab键作为字段分隔符,将每行文本分割成多个字段,并将这些字段保存到内建变量中(如$1
、$2
等)。awk
根据用户指定的模式或条件执行相应的操作,如打印、计算等。
二、awk的基本语法
2.1 awk命令的基本格式
awk '条件 { 动作 }' 文件名
- 1
- 条件:一个用于筛选行的表达式,如果省略条件,则对所有行执行动作。
-
动作:在满足条件的行上执行的操作,通常包括打印(
print
)或其他文本处理命令。 - 文件名:要处理的输入文件,如果省略文件名,则默认从标准输入读取数据。
2.2 常用选项
-
-F <分隔符>
:指定输入字段的分隔符,默认为空格或Tab键。 -
-v <变量名>=<值>
:定义一个变量并赋值,该变量在awk
程序开始前即可使用。 -
-f <脚本文件>
:从指定的脚本文件中读取awk
命令。
2.3 内置变量
-
NR
:当前行的行号。 -
NF
:当前行的字段数。 -
$0
:当前行的完整内容。 -
$1
、$2
、$3
等:当前行的第1、2、3等字段。 -
BEGIN
:在处理任何输入行之前执行的动作。 -
END
:在处理完所有输入行之后执行的动作。
三、awk的常用用法
3.1 打印整行或特定字段
示例1:打印文件的所有行
awk '{ print }' 文件名
- 1
或
awk '{ print $0 }' 文件名
- 1
示例2:打印文件的特定字段
awk '{ print $1, $3 }' 文件名
- 1
该命令将打印每行的第一和第三个字段,默认以空格分隔。
3.2 根据条件筛选行
示例3:打印文件的第二行
awk 'NR == 2 { print }' 文件名
- 1
示例4:打印包含特定字符串的行
awk '/特定字符串/ { print }' 文件名
- 1
3.3 自定义分隔符
示例5:以逗号分隔的字段
awk -F, '{ print $3 }' 文件名
- 1
该命令将使用逗号作为字段分隔符,并打印每行的第三个字段。
3.4 从文件中读取awk脚本
示例6:读取awk脚本文件
假设有一个文件,内容如下:
{ print $1, $3 }
- 1
可以使用以下命令执行该脚本:
awk -f 文件名
- 1
四、awk的高级特性
4.1 BEGIN和END模式
BEGIN
模式在处理任何输入行之前执行,通常用于初始化操作。END
模式在处理完所有输入行之后执行,通常用于输出结果。
示例7:统计文件中的行数
awk 'BEGIN { count = 0 } { count++ } END { print "Total lines:", count }' 文件名
- 1
4.2 数组和循环
awk
支持数组,可以在处理文本时使用数组来存储和遍历数据。
示例8:统计文件中各字段的出现次数
awk '{ for(i=1; i<=NF; i++) count[$i]++ } END { for(word in count) print word, count[word] }' 文件名
- 1
这个示例会统计文件中每个字段(默认以空格或Tab分隔)的出现次数,并在处理完所有行后打印出来。
4.3 内置函数
awk
提供了一系列内置函数,用于执行数学计算、字符串操作等。
示例9:使用内置函数进行数学计算
awk '{ total += $1 } END { print "Total sum:", total }' 文件名
- 1
这个示例计算了文件中第一列的总和。
示例10:字符串操作
awk '{ print toupper($1) }' 文件名
- 1
使用toupper
函数将第一列转换为大写。
4.4 多模式匹配
awk
允许使用多个模式,并在每个模式后指定相应的动作。
示例11:根据条件执行不同动作
awk '/模式1/ { 动作1 } /模式2/ { 动作2 }' 文件名
- 1
4.5 用户自定义函数
awk
还允许用户定义自己的函数,以增加程序的灵活性和可重用性。
示例12:定义并调用用户自定义函数
awk '
function sum(a, b) {
return a + b
}
{
print sum($1, $2)
}
' 文件名
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
这个示例定义了一个sum
函数,用于计算两个参数的和,并在每行上调用这个函数来打印第一列和第二列的和。
五、Shell脚本中awk的实际案例
5.1 案例1:处理日志文件
假设有一个Web服务器日志文件,其内容包含访问时间、IP地址、请求的资源等信息,现在需要统计每个IP地址的访问次数。
#!/bin/bash
awk '{ print $1 }' | sort | uniq -c | sort -nr
- 1
- 2
- 3
虽然这个案例没有直接使用awk
的复杂功能,但它展示了在shell脚本中结合使用多个文本处理工具的方法。为了更充分地利用awk
,我们可以改进这个脚本,使其只使用awk
来完成任务。
#!/bin/bash
awk '{ ip[$1]++ } END { for(i in ip) print i, ip[i] }' | sort -nr -k2
- 1
- 2
- 3
这个改进后的脚本使用awk
来统计每个IP地址的访问次数,并通过管道传递给sort
命令进行排序。
5.2 案例2:格式化CSV文件
假设有一个以逗号分隔的CSV文件,包含姓名、年龄和邮箱等信息,现在需要提取出所有的姓名和邮箱,并以特定格式输出。
#!/bin/bash
awk -F, '{ print "Name: " $1 ", Email: " $3 }'
- 1
- 2
- 3
这个脚本使用-F,
选项指定逗号作为字段分隔符,并打印出每行的第一和第三个字段,即姓名和邮箱。
5.3 案例3:计算文本文件的平均数
假设有一个包含数字的文本文件,现在需要计算这些数字的平均值。
#!/bin/bash
awk '{ sum += $1; count++ } END { if(count > 0) print "Average:", sum/count }'
- 1
- 2
- 3
这个脚本逐行读取文件,将每行的第一个字段(假设为数字)累加到
sum
变量中,并计数。在处理完所有行后,如果计数大于0,则计算并打印平均值。
六、总结
awk
是Linux/Unix系统中非常强大的文本处理工具,通过模式匹配和条件执行,能够高效地处理和分析文本数据。本教程详细介绍了awk
的基本语法、常用选项、内置变量、高级特性以及结合shell脚本的实际案例,希望能够帮助读者更好地理解和应用awk
。通过不断练习和实践,读者可以掌握awk
的更多高级功能和技巧,从而在处理文本数据时更加得心应手。