awk 语法解析-前端学习

awk 是一种强大的文本处理工具,擅长对 ​​结构化文本​ ​(如日志、CSV、配置文件)进行 ​​逐行扫描、模式匹配、数据提取和计算​​。以下是它的核心语法解析和实用示例:

​​1. 基础语法结构​​

arduino 复制代码
awk 'pattern {action}' [输入文件]
  • ​pattern​ :匹配条件(可选),如 /error/ 或 NR > 5。
  • ​action​ :对匹配行执行的操作,如 print $1。
  • ​若省略 pattern​ :对所有行执行 action。
  • ​若省略 action​:默认打印匹配的整行。

​​2. 内置变量​​

变量

含义

示例

NR

当前行号(从1开始)

NR == 10 匹配第10行

NF

当前行的字段数(列数)

{print $NF} 打印最后一列

FS

输入字段分隔符(默认空格)

BEGIN{FS=","} 设为逗号

OFS

输出字段分隔符(默认空格)

BEGIN{OFS="-"} 输出用-

FILENAME

当前处理的文件名

{print FILENAME}

​​3. 字段引用​​

  • ​$0​:整行内容。
  • ​$1, $2, ... $NF​:第1、第2...到最后一列。
  • ​$(NF-1)​:倒数第二列。

​​示例​​:打印每行的第一列和最后一列

dart 复制代码
awk '{print $1, $NF}' file.txt

​​4. 模式(Pattern)类型​​

​​(1) 正则匹配​​

c 复制代码
awk '/error/ {print $0}' log.txt      # 打印含 "error" 的行
awk '!/debug/ {print $2}' log.txt    # 打印不含 "debug" 的行的第2列

​​(2) 行号匹配​​

bash 复制代码
awk 'NR >= 5 && NR <= 10' file.txt   # 打印5到10行

​​(3) 字段条件​​

dart 复制代码
awk '$3 > 100 {print $1}' data.csv   # 第3列大于100时打印第1列

​​(4) BEGIN/END 块​​

bash 复制代码
awk 'BEGIN {sum=0} {sum+=$1} END {print sum}' nums.txt  # 计算第1列总和

​​5. 常用操作(Action)​​

​​(1) 打印控制​​

makefile 复制代码
awk '{print "Line", NR, ":", $0}' file.txt  # 自定义输出格式

​​(2) 计算与统计​​

kotlin 复制代码
awk '{sum+=$1; count++} END {print "Avg:", sum/count}' data.txt

​​(3) 字段重排​​

dart 复制代码
awk '{print $3, $1, $2}' file.txt  # 按第3、第1、第2列顺序输出

​​(4) 条件分支​​

swift 复制代码
awk '{if ($1 > 50) print "High"; else print "Low"}' data.txt

​​6. 高级用法​​

​​(1) 自定义分隔符​​

arduino 复制代码
awk -F',' '{print $2}' data.csv       # 输入分隔符为逗号
awk 'BEGIN{FS="[:;]"} {print $2}'     # 分隔符可以是正则(如 `:` 或 `;`)

​​(2) 多文件处理​​

bash 复制代码
awk '{print FILENAME, $0}' file1.txt file2.txt  # 打印文件名和内容

​​(3) 关联数组(哈希表)​​

ini 复制代码
awk '{count[$1]++} END {for (k in count) print k, count[k]}' log.txt
# 统计第一列各值的出现次数

​​(4) 调用外部命令​​

css 复制代码
awk '{system("echo " $1 " | tr a-z A-Z")}' names.txt  # 调用系统命令

​​7. 经典案例​​

​​(1) 统计日志中每种状态的次数​​

ini 复制代码
awk '{status[$9]++} END {for (s in status) print s, status[s]}' access.log
# 假设第9列是HTTP状态码(如200、404)

​​(2) 提取CSV的特定列​​

dart 复制代码
awk -F',' '$3 ~ /2023/ {print $1, $4}' data.csv  # 第3列含"2023"时输出1、4列

​​(3) 过滤重复行​​

bash 复制代码
awk '!seen[$0]++' file.txt  # 仅保留第一次出现的行

​​(4) 数据格式化​​

swift 复制代码
awk '{printf "%-10s %5d\n", $1, $2}' table.txt  # 左对齐名称,右对齐数字

​​8. 注意事项​​

  1. ​字段编号从1开始​ ,$0 是整行。
  2. ​默认行为​ :无 pattern 时匹配所有行,无 action 时打印整行。
  3. ​性能​:处理大文件时,避免在循环中频繁打印。
  4. ​兼容性​ :不同系统上的 awk 实现(如 GNU awk gawk)可能有扩展功能。

掌握这些语法后,你可以用 awk 高效处理日志分析、数据清洗、报表生成等任务!

相关推荐
红尘散仙5 小时前
谁说终端只能敲键盘?我用 Rust 给小说阅读器加上了鼠标
前端·后端·rust
陈随易6 小时前
C++26 草案被否,二十八年来头一回
前端·后端·程序员
ZhengEnCi6 小时前
Agent 工具怎么折叠海量输出才「爽」:Trae、Claude Code 的渐进式披露设计原理
前端·agent
2035去旅行8 小时前
bootcmd 详细讲解
linux·嵌入式·arm·soc
陈希1239 小时前
Linux 防火墙配置实战:firewalld、iptables 与云安全组
linux·运维·服务器
IT_陈寒9 小时前
Redis内存暴涨,没想到是AOF重写捣的鬼
前端·人工智能·后端
ikoala9 小时前
让 Codex 自己查账:一个省 token 的小技巧
前端·后端·ai编程
女神下凡10 小时前
芯参谋(95):嵌入式文件系统_开发指南
linux·服务器·arm开发·驱动开发·设计规范
ikoala10 小时前
AI 写页面像说明书,修 Bug 像贴膏药?把这两句话写进 AGENTS.md
前端·javascript·ai编程
去伪存真12 小时前
AI Agent Harness 深度测评与技术选型实战
前端·agent