当前位置: 首页 > news >正文

Linux下AWK命令使用方法

文章目录

      • **一、AWK 基本语法**
      • **二、核心概念**
        • **1. 内置变量**
        • **2. 分隔符**
        • **3. BEGIN 和 END 块**
      • **三、常见用法示例**
        • **1. 基础打印**
        • **2. 条件过滤**
        • **3. 计算与统计**
        • **4. 字符串操作**
        • **5. 处理 CSV 文件**
      • **四、高级用法**
        • **1. 使用数组统计**
        • **2. 多条件分支(if-else)**
        • **3. 结合外部命令**
        • **4. 自定义函数**
      • **五、实战场景示例**
        • **1. 分析 Nginx 访问日志**
        • **2. 提取特定时间段日志**
        • **3. 生成格式化报告**
      • **六、常用技巧**
      • **七、性能优化**

AWK 是 Linux 下功能强大的文本处理工具,擅长按列处理结构化数据(如日志、CSV)。它以逐行方式处理文本,支持条件过滤、计算、格式化输出等。以下是 AWK 的核心用法和常见场景:


一、AWK 基本语法

awk '模式 {动作}' 文件名
  • 模式:过滤行的条件(如正则表达式、逻辑判断)。
  • 动作:对匹配的行执行的操作(如打印、计算)。
  • 未指定模式:默认处理所有行。
  • 未指定动作:默认打印整行。

二、核心概念

1. 内置变量
  • $0:当前行的全部内容。
  • $1, $2, ..., $n:第 1 到第 n 列的内容(默认以空格或制表符分隔)。
  • NF:当前行的列数(Number of Fields)。
  • NR:当前处理的行号(Number of Record)。
  • FS:输入字段分隔符(默认空格,可通过 -F 指定)。
  • OFS:输出字段分隔符(默认空格)。
2. 分隔符
  • 指定输入分隔符(如 :,):
    awk -F ':' '{print $1}' /etc/passwd   # 输出第一列(用户名)
    
3. BEGIN 和 END 块
  • BEGIN:在处理任何行前执行一次。
  • END:在处理所有行后执行一次。
    awk 'BEGIN {sum=0} {sum+=$1} END {print sum}' data.txt  # 计算第一列总和
    

三、常见用法示例

1. 基础打印
# 打印文件所有内容
awk '{print}' file.txt

# 打印第一列和第三列
awk '{print $1, $3}' file.txt

# 自定义输出格式(OFS 控制列分隔符)
awk -v OFS=" | " '{print $1, $3}' file.txt
2. 条件过滤
# 打印第二列大于 100 的行
awk '$2 > 100 {print $0}' data.txt

# 匹配包含 "error" 的行(不区分大小写)
awk '/error/i {print}' log.txt

# 逻辑组合(&& 和 ||)
awk '$1 == "admin" && $3 > 50 {print $2}' users.txt
3. 计算与统计
# 计算第一列的总和
awk '{sum += $1} END {print sum}' data.txt

# 统计行数
awk 'END {print NR}' data.txt

# 求某一列的平均值
awk '{sum += $2} END {print sum/NR}' data.txt
4. 字符串操作
# 拼接字符串
awk '{print "User: " $1 ", Age: " $2}' users.txt

# 截取子字符串(substr)
awk '{print substr($1, 1, 3)}' data.txt  # 输出第一列的前3个字符

# 替换文本(gsub)
awk '{gsub("old", "new"); print}' file.txt
5. 处理 CSV 文件
# 指定逗号为分隔符
awk -F ',' '{print $2}' data.csv

# 过滤第三列为 "success" 的行
awk -F ',' '$3 == "success" {print $1, $4}' data.csv

四、高级用法

1. 使用数组统计
# 统计某列唯一值出现次数(如统计IP访问次数)
awk '{ip_count[$1]++} END {for (ip in ip_count) print ip, ip_count[ip]}' access.log
2. 多条件分支(if-else)
awk '{
    if ($2 >= 90) grade = "A";
    else if ($2 >= 80) grade = "B";
    else grade = "C";
    print $1, grade
}' scores.txt
3. 结合外部命令
# 结合 shell 变量
name="admin"
awk -v user="$name" '$1 == user {print $3}' users.txt

# 调用系统命令(system)
awk '{if ($3 > 100) system("echo Alert: " $1)}' data.txt
4. 自定义函数
awk '
function add(a, b) {
    return a + b
}
{
    print add($1, $2)
}' numbers.txt

五、实战场景示例

1. 分析 Nginx 访问日志
# 统计访问量前10的IP
awk '{print $1}' access.log | sort | uniq -c | sort -nr | head -n 10

# 直接用 AWK 实现
awk '{ip_count[$1]++} END {for (ip in ip_count) print ip_count[ip], ip}' access.log | sort -nr | head -n 10
2. 提取特定时间段日志
# 提取 2023-10-01 10:00 到 11:00 的日志
awk '/\[01\/Oct\/2023:10:00:/, /\[01\/Oct\/2023:11:00:/' access.log
3. 生成格式化报告
awk -F ',' 'BEGIN {print "Name,Total"}
{
    total = $2 + $3 + $4
    print $1 "," total
}' students.csv

六、常用技巧

  1. 跳过标题行
    awk 'NR > 1 {print $1}' data.csv
    
  2. 修改输出分隔符
    awk -v OFS='\t' '{print $1, $3}' file.txt  # 输出制表符分隔
    
  3. 处理多文件
    awk '{print FILENAME, $0}' file1.txt file2.txt  # 输出时包含文件名
    

七、性能优化

  • 避免频繁打印:减少 print 次数,尽量在 END 块输出结果。
  • 预处理大文件:使用 grepsed 先过滤数据,再用 AWK 处理。
  • 简化正则表达式:复杂的正则表达式会显著降低处理速度。

AWK 是文本处理的瑞士军刀,掌握后可高效处理日志、报表等结构化数据。结合 man awkinfo awk 查阅完整文档,可进一步探索其高级功能(如多维数组、位操作等)。

相关文章:

  • JavaScript中的Math()
  • SpringBoot优雅关机,监听关机事件,docker配置
  • gbase8s数据库检测非法字符
  • VSCode 配置优化指南:打造高效的 uni-app、Vue2/3、JS/TS 开发环境
  • JS—组成:2分钟掌握什么是ECMAScript操作,什么是DOM操作,什么是BOM操作
  • 在Blender中给SP分纹理组
  • GStreamer —— 2.6、Windows下Qt加载GStreamer库后运行 - “教程6:媒体格式和Pad功能“(附:完整源码)
  • 基于Spring Boot的多级缓存架构实现
  • C++学习(十四)(使用库)
  • JVM详解
  • C# 开发工具Visual Studio下载和安装
  • vue3中子组件获取父组件的name,父组件不做修改动作
  • JavaScript中的主要知识点
  • Windows 图形显示驱动开发-WDDM 3.2-GPU-P 设备上的实时迁移(一)
  • 【vscode】一键编译运行c/c++程序
  • 深度解析 slabtop:实时监控内核缓存的利器
  • 短分享-Flink图构建
  • python里调用外部控制台应用程序的方法~
  • 【人工智能学习之局部极小值与鞍点】
  • 测试用例详解
  • 商务部:对原产于美国、欧盟、台湾地区和日本的进口共聚聚甲醛征收反倾销税
  • 北斗系统全面进入11个国际组织的标准体系
  • 芬兰直升机相撞坠毁事故中五名人员全部遇难
  • 陈刚:推动良好政治生态和美好自然生态共生共优相得益彰
  • 美国考虑让移民上真人秀竞逐公民权,制片人称非现实版《饥饿游戏》
  • 有关“普泽会”,俄官方表示:有可能