Linux 下的 AWK 命令详细指南与示例

目录

    • 简介
    • [AWK 的主要特性](#AWK 的主要特性)
    • 基本语法
    • 示例
      • [1. 打印文件的所有行](#1. 打印文件的所有行)
      • [2. 打印特定字段](#2. 打印特定字段)
      • [3. 打印匹配模式的行](#3. 打印匹配模式的行)
      • [4. 基于条件过滤并打印](#4. 基于条件过滤并打印)
      • [5. 使用内置变量](#5. 使用内置变量)
      • [6. 执行算术运算](#6. 执行算术运算)
      • [7. 字符串操作](#7. 字符串操作)
      • [8. 使用 BEGIN 和 END 块](#8. 使用 BEGIN 和 END 块)
      • [9. 处理分隔符文件](#9. 处理分隔符文件)
    • 高级功能
    • 总结

简介

AWK 是 Linux 中功能强大的文本处理工具,用于模式扫描和处理。AWK 以其创建者(Aho、Weinberger 和 Kernighan)的名字命名,特别适合处理如日志、CSV 文件或配置文件等结构化文本数据。本指南全面讲解了 AWK 的功能,并通过实际示例展示其强大之处。

AWK 的主要特性

  • 模式匹配:处理文件中符合特定模式的行。
  • 字段操作:轻松访问和操作结构化文本中的特定字段。
  • 算术运算:在命令中直接执行计算。
  • 内置函数:支持字符串处理、数学运算等多种功能。
  • 可移植性:适用于大多数类 Unix 系统。

基本语法

bash 复制代码
awk 'pattern {action}' filename
  • pattern:决定是否对某行执行动作的条件。
  • action:指定对匹配行执行的代码块。
  • filename:要处理的输入文件。

示例

1. 打印文件的所有行

bash 复制代码
awk '{print}' file.txt

此命令打印 file.txt 的所有行。{print} 操作适用于每一行。

2. 打印特定字段

AWK 使用 $1、$2 等表示一行中的字段。

bash 复制代码
awk '{print $1, $3}' file.txt

打印 file.txt 每行的第一和第三字段。

3. 打印匹配模式的行

bash 复制代码
awk '/pattern/' file.txt

打印包含"pattern"的行。

4. 基于条件过滤并打印

bash 复制代码
awk '$3 > 50 {print $1, $3}' file.txt

打印第三字段大于 50 的行的第一和第三字段。

5. 使用内置变量

  • NR:当前记录(行)的编号。
  • NF:当前记录中的字段数量。
bash 复制代码
awk '{print NR, NF, $0}' file.txt

打印行号、字段数和整行内容。

6. 执行算术运算

bash 复制代码
awk '{sum += $3} END {print "Total:", sum}' file.txt

计算并打印所有行的第三字段的总和。

7. 字符串操作

bash 复制代码
awk '{print toupper($1)}' file.txt

将每行的第一个字段转换为大写。

8. 使用 BEGIN 和 END 块

bash 复制代码
awk 'BEGIN {print "Start Processing"} {print $0} END {print "End Processing"}' file.txt
  • BEGIN 块在处理任何行之前执行。
  • END 块在处理完所有行后执行。

9. 处理分隔符文件

默认情况下,AWK 使用空格分割字段。可以使用 -F 指定自定义分隔符。

bash 复制代码
awk -F ',' '{print $1, $3}' file.csv

处理 CSV 文件并打印第一和第三字段。

高级功能

自定义脚本

将 AWK 脚本保存到文件中以便重复使用:

script.awk:

awk 复制代码
BEGIN {print "Name	Score"}
$3 > 60 {print $1, $3}
END {print "Processing Complete"}

运行脚本:

bash 复制代码
awk -f script.awk file.txt

使用外部变量

通过 -v 标志将变量传递给 AWK:

bash 复制代码
awk -v threshold=50 '$3 > threshold {print $1, $3}' file.txt

总结

AWK 是一个功能强大的文本处理工具,对于在 Linux 上处理数据的人来说至关重要。其简单性与强大功能的结合,使其在从简单的文本提取到复杂的数据转换的任务中都表现出色。

相关推荐
律宏阔2 小时前
WSL Docker 端口明明空闲,但就是绑不上端口
linux·windows
律宏阔2 小时前
WSL 突然断网,无法 ping 内网或外网
linux·windows
穷人小水滴2 小时前
用容器编译 VirtualBox 虚拟机软件 (ArchLinux, podman)
linux·容器·virtualbox
乱码三千2 小时前
如何优雅地直连无公网 IP 的远程 GPU 服务器
linux·人工智能·程序员
yunwei372 小时前
使用 eBPF 跟踪 Nginx 请求
linux·后端·性能优化
yunwei372 小时前
使用 eBPF 跟踪 MySQL 查询
linux·后端·性能优化
yunwei372 小时前
eBPF 示例教程:使用 XDP 捕获 TCP 信息
linux·后端·性能优化
judezh2 小时前
api 容器一直 unhealthy?我把一个 Agent 运行时的健康检查逐条拆了,查出四个问题
运维·docker
GeW3 小时前
制造业高端化,为什么必须重估Linux和数据库?
linux
百万蹄蹄向前冲3 小时前
双端同步!云服务器装最新Node.js v26.10全过程追踪
服务器·人工智能·node.js