欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 科技 > 能源 > 【基础】每天掌握一个Linux命令 - awk

【基础】每天掌握一个Linux命令 - awk

2025/6/8 0:26:45 来源:https://blog.csdn.net/cui_win/article/details/148483445  浏览:    关键词:【基础】每天掌握一个Linux命令 - awk

目录

  • 【基础】每天掌握一个Linux命令 - awk
    • 一、工具概述
    • 二、安装方式
      • Ubuntu/Debian系统:
      • CentOS/RHEL系统:
      • macOS系统:
    • 三、核心功能
    • 四、基础用法
      • 基本语法
      • 常用选项
      • 内置变量
      • 基本操作示例
        • 1. 打印文件所有内容
        • 2. 打印每行的第一个字段
        • 3. 指定分隔符为冒号(:),打印每行的第三个字段
        • 4. 打印包含特定字符串的行
        • 5. 打印行数
        • 6. 打印字段数最多的行
        • 7. 计算所有数字的总和
        • 8. 打印每行的字段数
    • 五、进阶操作
      • 1. 使用条件表达式筛选数据
        • 示例数据 (students.txt):
        • 打印数学成绩大于80的学生
        • 计算并打印每个学生的平均分
      • 2. 使用循环处理数据
        • 打印每个学生的所有成绩
      • 3. 多文件处理
        • sales1.txt:
        • sales2.txt:
        • 计算每个产品的总销售额
      • 4. 格式化输出
        • 按列对齐输出学生成绩和平均分
      • 5. 内置函数应用
        • 字符串处理示例:转换为大写
        • 数学函数示例:计算平方根
    • 六、实战案例
      • 1. 面试题实战
        • 题目:统计日志文件中每个IP的访问次数,并按次数降序排列
        • 题目:提取日志中状态码为404的URL
      • 2. 生产场景实战
        • 案例1:监控服务器负载
        • 案例2:分析系统日志
        • 案例3:处理CSV文件
      • 3. 文本处理实战
        • 案例1:提取HTML标签内容
        • 案例2:批量重命名文件
    • 七、注意事项

【基础】每天掌握一个Linux命令 - awk

在Linux的世界里,当你面对海量数据需要筛选、统计时,awk就像是一把精准的手术刀,能迅速定位并处理你需要的信息。简单来说,它是一个强大的文本分析工具,让你无需编写复杂的程序,就能轻松完成数据提取与转换,特别适合处理格式化文本,如日志文件、CSV表格等。

一、工具概述

awk是一种优良的文本处理工具,Linux及Unix环境中现有的功能最强大的数据处理引擎之一。其名称得自于它的创始人 Alfred Aho、Peter Weinberger 和 Brian Kernighan 姓氏的首个字母。awk程序设计语言,包括正则表达式、循环、变量等,支持用户自定义函数和动态正则表达式等先进功能,是数据处理和报表生成的理想工具。

二、安装方式

在大多数Linux发行版中,awk通常已经预装。如果需要检查是否安装,可以使用以下命令:

awk --version

如果系统中没有安装,可以使用包管理器进行安装:

Ubuntu/Debian系统:

sudo apt-get install gawk

CentOS/RHEL系统:

sudo yum install gawk

macOS系统:

brew install gawk

三、核心功能

功能分类功能描述
文本处理逐行读取文本并按指定规则处理,可结合正则表达式进行模式匹配
数据提取根据字段分隔符分割每行文本,提取特定字段内容
格式化输出按照指定格式输出处理后的数据,支持对齐、填充等
统计分析计算总和、平均值、最大值、最小值等统计信息
条件判断根据条件表达式筛选符合条件的记录
循环处理支持for、while等循环结构,处理复杂数据
自定义函数允许用户创建自定义函数扩展功能
文件操作可以读取和处理多个输入文件,支持输出到文件

四、基础用法

基本语法

awk [选项] '模式{动作}' 文件1 文件2 ...

常用选项

选项描述
-F fs指定输入文件的字段分隔符,fs为分隔符字符串
-v var=val定义或设置变量var的值为val
-f file从文件file中读取awk脚本,而不是在命令行中直接输入
-W option指定GNU awk特定的选项,如–lint检查语法错误
–help显示帮助信息

内置变量

变量描述
$0当前处理的行的整行内容
1 − 1- 1n当前行被分割后的第1到第n个字段
NF当前行的字段数量
NR到目前为止已处理的行数
FNR当前文件已处理的行数
FS输入字段分隔符,默认是空格或制表符
OFS输出字段分隔符,默认是空格
RS输入记录分隔符,默认是换行符
ORS输出记录分隔符,默认是换行符
FILENAME当前输入文件的名称
ARGC命令行参数的数量
ARGV命令行参数数组

基本操作示例

1. 打印文件所有内容
awk '{print}' filename.txt
2. 打印每行的第一个字段
awk '{print $1}' filename.txt
3. 指定分隔符为冒号(😃,打印每行的第三个字段
awk -F: '{print $3}' /etc/passwd
4. 打印包含特定字符串的行
awk '/pattern/{print}' filename.txt
5. 打印行数
awk 'END{print NR}' filename.txt
6. 打印字段数最多的行
awk '{if(NF>max) max=NF; maxline=$0} END{print maxline}' filename.txt
7. 计算所有数字的总和
awk '{sum+=$1} END{print sum}' numbers.txt
8. 打印每行的字段数
awk '{print NF}' filename.txt

五、进阶操作

1. 使用条件表达式筛选数据

示例数据 (students.txt):
Alice 85 90 78
Bob 76 88 92
Charlie 92 89 95
David 65 70 68
打印数学成绩大于80的学生
awk '$2 > 80 {print $1, $2}' students.txt

输出结果:

Alice 85
Charlie 92
计算并打印每个学生的平均分
awk '{avg=($2+$3+$4)/3; print $1, avg}' students.txt

输出结果:

Alice 84.3333
Bob 85.3333
Charlie 92
David 67.6667

2. 使用循环处理数据

打印每个学生的所有成绩
awk '{for(i=2; i<=NF; i++) print $1, "subject", i-1, ":", $i}' students.txt

输出结果:

Alice subject 1 : 85
Alice subject 2 : 90
Alice subject 3 : 78
Bob subject 1 : 76
Bob subject 2 : 88
Bob subject 3 : 92
Charlie subject 1 : 92
Charlie subject 2 : 89
Charlie subject 3 : 95
David subject 1 : 65
David subject 2 : 70
David subject 3 : 68

3. 多文件处理

假设有两个文件:sales1.txtsales2.txt,内容如下:

sales1.txt:
ProductA 100 15
ProductB 200 20
sales2.txt:
ProductA 150 18
ProductC 300 25
计算每个产品的总销售额
awk '{total[$1] += $2 * $3} END{for(product in total) print product, total[product]}' sales1.txt sales2.txt

输出结果:

ProductA 4200
ProductB 4000
ProductC 7500

4. 格式化输出

按列对齐输出学生成绩和平均分
awk '{avg=($2+$3+$4)/3; printf "%-10s %3d %3d %3d %6.2f\n", $1, $2, $3, $4, avg}' students.txt

输出结果:

Alice      85  90  78  84.33
Bob        76  88  92  85.33
Charlie    92  89  95  92.00
David      65  70  68  67.67

5. 内置函数应用

字符串处理示例:转换为大写
awk '{print toupper($1)}' students.txt

输出结果:

ALICE
BOB
CHARLIE
DAVID
数学函数示例:计算平方根
awk '{print sqrt($2)}' numbers.txt

六、实战案例

1. 面试题实战

题目:统计日志文件中每个IP的访问次数,并按次数降序排列

示例日志 (access.log):

192.168.1.1 - - [01/Jan/2023:00:00:01 +0800] "GET /index.html HTTP/1.1" 200 1234
192.168.1.2 - - [01/Jan/2023:00:00:02 +0800] "GET /index.html HTTP/1.1" 200 1234
192.168.1.1 - - [01/Jan/2023:00:00:03 +0800] "GET /about.html HTTP/1.1" 200 1234

解决方案:

awk '{count[$1]++} END{for(ip in count) print ip, count[ip]}' access.log | sort -k2 -nr

输出结果:

192.168.1.1 2
192.168.1.2 1
题目:提取日志中状态码为404的URL

解决方案:

awk '$9 == "404" {print $7}' access.log

2. 生产场景实战

案例1:监控服务器负载

需求: 实时监控服务器的CPU使用率,当超过80%时发出警告

解决方案:

top -bn1 | grep "Cpu(s)" | awk '{print $2 + $4}' | awk '{if($1 > 80) print "CPU警告: 当前使用率为", $1, "%"}'
案例2:分析系统日志

需求: 统计/var/log/syslog中出现次数最多的5个程序

解决方案:

grep -oP '\[\K[^]]+' /var/log/syslog | awk '{count[$1]++} END{for(prog in count) print count[prog], prog}' | sort -nr | head -5
案例3:处理CSV文件

需求: 从销售数据中计算每个地区的总销售额

示例数据 (sales.csv):

Region,Product,Amount
North,ProductA,1000
South,ProductB,1500
North,ProductC,2000

解决方案:

awk -F',' 'NR>1 {total[$1]+=$3} END{for(region in total) print region, total[region]}' sales.csv

输出结果:

North 3000
South 1500

3. 文本处理实战

案例1:提取HTML标签内容

需求: 从HTML文件中提取所有链接

解决方案:

awk -v RS='</a>' '/<a / {match($0, /href="[^"]+"/); print substr($0, RSTART+6, RLENGTH-7)}' index.html
案例2:批量重命名文件

需求: 将所有.jpg文件重命名为JPG后缀

解决方案:

ls *.jpg | awk -F. '{print "mv", $0, $1 ".JPG"}' | sh

七、注意事项

  1. 字段分隔符问题:默认情况下,awk使用空格或制表符作为字段分隔符。如果数据中包含多个连续空格,可能会导致字段分割不准确。此时应使用-F选项明确指定分隔符。

  2. 变量区分大小写:awk中的变量区分大小写,例如varVar是不同的变量。

  3. 正则表达式陷阱:在awk中使用正则表达式时,需要注意元字符的转义问题。例如,要匹配点号(.),需要使用\.

  4. 性能考虑:虽然awk是处理文本的强大工具,但在处理超大型文件时,性能可能会成为问题。此时应考虑使用更高效的工具或优化awk脚本。

  5. BEGIN和END块:BEGIN块在处理输入文件之前执行,END块在处理完所有输入文件后执行。这两个块是可选的,但在需要初始化变量或输出汇总信息时非常有用。

  6. 内置函数限制:不同版本的awk可能支持不同的内置函数。在使用特定函数之前,最好先查阅对应版本的文档。

  7. 文件读取顺序:当处理多个输入文件时,awk会按命令行中指定的顺序依次处理每个文件。FNR变量会在每个文件开始时重置,而NR变量会继续递增。

  8. 字符串和数值比较:awk会自动识别变量的类型,但在进行比较时需要注意类型转换问题。例如,字符串"10"在数值比较时会被转换为数字10。

  9. 命令行参数限制:如果需要传递大量参数给awk,可能会遇到系统命令行长度限制的问题。此时应考虑将参数存储在文件中,然后使用-f选项读取。

  10. 错误处理:在编写复杂的awk脚本时,建议使用-W lint选项检查语法错误,确保脚本的正确性。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词