【linux】Shell脚本三剑客之awk命令的详细用法攻略

时间:2024-10-05 08:51:32

在这里插入图片描述

✨✨ 欢迎大家来到景天科技苑✨✨

???????? 养成好习惯,先赞后看哦~????????

???? 作者简介:景天科技苑
????《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,****全栈领域优质创作者,掘金优秀博主,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的更多高级功能和技巧,从而在处理文本数据时更加得心应手。