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

相关推荐
TeamDev1 分钟前
如何在 DotNetBrowser 中使用本地 AI 模型
前端·后端·.net
杨云龙UP2 分钟前
ODA运维实战:Oracle 19c YJXT PDB表空间在线扩容全过程_20260503
linux·运维·服务器·数据库·oracle
郝学胜-神的一滴6 分钟前
跨平台动态库与头文件:从原理到命名的深度解析
linux·c++·程序人生·unix·cmake
谢尔登20 分钟前
10_从 React Hooks 本质看 useState
前端·ubuntu·react.js
辰同学ovo21 分钟前
从全局登录状态管理学习 Redux
前端·javascript·学习·react.js
陈随易43 分钟前
2年没用Nodejs了,Bun很香
前端·后端·程序员
donecoding1 小时前
Corepack 完全解析:从懵到懂,包管理器自由了
前端·node.js·前端工程化
yqcoder1 小时前
端经典面试题:为什么 0.1 + 0.2 !== 0.3?
前端·css
吠品1 小时前
高性能JS数组操作:何时选用push、unshift、splice或扩展运算符?
linux·服务器·数据库
ZC跨境爬虫1 小时前
跟着 MDN 学 HTML day_12:(HTML网页图片嵌入)
前端·javascript·css·ui·html