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 高效处理日志分析、数据清洗、报表生成等任务!

相关推荐
鹏多多2 小时前
纯前端人脸识别利器:face-api.js手把手深入解析教学
前端·javascript·人工智能
无奈何杨3 小时前
CoolGuard增加枚举字段支持,条件编辑优化,展望指标取值不同
前端·后端
掘金安东尼3 小时前
工具过多:如何管理前端工具泛滥?
前端
江城开朗的豌豆3 小时前
从生命周期到useEffect:我的React函数组件进化之旅
前端·javascript·react.js
brzhang3 小时前
当AI接管80%的执行,你“不可替代”的价值,藏在这20%里
前端·后端·架构
江城开朗的豌豆3 小时前
React组件传值:轻松掌握React组件通信秘籍
前端·javascript·react.js
Sailing3 小时前
别再放任用户乱填 IP 了!一套前端 IP 与 CIDR 校验的高效方案
前端·javascript·面试
程序员爱钓鱼6 小时前
Go语言实战案例 — 项目实战篇:简易博客系统(支持评论)
前端·后端·go
excel13 小时前
ES6 中函数的双重调用方式:fn() 与 fn\...``
前端