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

Linux awk 命令使用说明

Linux awk 命令使用说明

简介

awk 是一种强大的文本处理工具,在 Linux/Unix 系统中被广泛使用。它由 Alfred Aho、Peter Weinberger 和 Brian Kernighan 开发,名称来源于他们姓氏的首字母。awk 能够对文本进行模式扫描、数据提取、统计分析和格式化输出等操作,特别适合处理结构化数据(如日志、CSV、表格等)。

基本语法

$ awk [选项] '模式 {动作}' 文件...

参数说明:

  • 选项:控制 awk 命令的行为
  • 模式:用于匹配文本行的条件,可以是正则表达式、比较表达式等
  • 动作:在匹配到的行上执行的操作,通常是一系列语句,用花括号 {} 括起来
  • 文件:要处理的文本文件,多个文件用空格分隔;若不指定文件,则从标准输入读取数据

常用选项

选项描述示例
-F指定字段分隔符awk -F ',' '{print $1}' data.csv
-f指定包含 awk 程序的文件awk -f script.awk data.txt
-v定义变量并赋值awk -v var=10 '{print $1 + var}' data.txt
-O优化输出,减少冗余空行awk -O '{print $1}' data.txt
--posix启用 POSIX 兼容模式awk --posix '{print $1}' data.txt

内置变量

变量描述示例
$0整行内容awk '{print $0}' data.txt
$1, $2, ...第1、2、…个字段awk '{print $1, $3}' data.txt
NF当前行的字段数量awk '{print NF}' data.txt
NR当前行的行号awk '{print NR, $0}' data.txt
FNR当前文件中的行号awk '{print FNR, $0}' file1.txt file2.txt
FS字段分隔符(默认空格或制表符)awk 'BEGIN{FS=","}{print $1}' data.csv
OFS输出字段分隔符(默认空格)`awk 'BEGIN{OFS="
RS记录分隔符(默认换行符)awk 'BEGIN{RS=";"} {print $0}' data.txt
ORS输出记录分隔符(默认换行符)awk 'BEGIN{ORS=";"} {print $0}' data.txt
FILENAME当前处理的文件名awk '{print FILENAME, $0}' data.txt

模式匹配

1. 正则表达式模式

# 匹配包含 "error" 的行
$ awk '/error/ {print $0}' log.txt# 匹配以 "root" 开头的行
$ awk '/^root/ {print $0}' /etc/passwd# 匹配以 ".txt" 结尾的行
$ awk '/\.txt$/ {print $0}' file.list

2. 比较表达式模式

# 第二个字段大于 20 的行
$ awk '$2 > 20 {print $1}' students.txt# 第一个字段等于 "Bob" 的行
$ awk '$1 == "Bob" {print $0}' students.txt# 第三个字段不等于 "Math" 的行
$ awk '$3 != "Math" {print $1}' students.txt

3. 范围模式

# 匹配从包含 "start" 的行到包含 "end" 的行
$ awk '/start/,/end/ {print $0}' data.txt

动作语句

1. 输出语句

# 打印整行
$ awk '{print}' data.txt# 打印指定字段
$ awk '{print $1, $3}' data.txt# 格式化输出
$ awk '{printf "Name: %s, Age: %d\n", $1, $2}' students.txt

2. 条件语句

# 简单条件判断
$ awk '{if ($2 > 20) print $1 " is old"; else print $1 " is young"}' students.txt# 多条件判断
$ awk '{if ($2 > 20 && $3 == "CS") print $1}' students.txt

3. 循环语句

# for 循环
$ awk '{for (i=1; i<=NF; i++) print "Field " i ": " $i}' data.txt# while 循环
$ awk '{i=1; while (i<=NF) {print $i; i++}}' data.txt

使用示例

1. 基本数据提取

# 假设 students.txt 内容: Alice 20 CS Bob 22 Math Charlie 21 Physics# 打印所有行
$ awk '{print}' students.txt# 打印第一列
$ awk '{print $1}' students.txt# 打印第一列和第三列
$ awk '{print $1, $3}' students.txt# 指定分隔符为逗号
$ echo "Alice,20,CS" | awk -F ',' '{print $1, $3}'

2. 统计分析

# 统计文件行数
$ awk 'END{print NR}' data.txt# 统计字段数大于 3 的行数
$ awk 'NF > 3 {count++} END{print count}' data.txt# 计算第二列的总和
$ awk '{sum += $2} END{print sum}' numbers.txt# 统计每种 HTTP 方法的出现次数
$ awk '{method[$4]++} END{for(type in method) print type, method[type]}' server.log

3. 格式化输出

# 格式化打印表格
$ awk 'BEGIN{print "Name\tAge\tMajor"} {printf "%-10s %-5d %-10s\n", $1, $2, $3}' students.txt# 将输出字段分隔符设置为逗号
$ awk 'BEGIN{OFS=","} {print $1, $2, $3}' students.txt > students.csv

4. 文本处理

# 替换文本中的字符串
$ awk '{gsub(/error/, "warning"); print}' log.txt# 将第一列转换为大写
$ awk '{print toupper($1)}' data.txt# 提取文件中的 IP 地址
$ awk '{match($0, /([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)/, ip); print ip[1]}' log.txt

5. 高级应用:BEGIN 和 END 块

# 在处理数据前输出表头
$ awk 'BEGIN{print "Name\tAge\tMajor"} {print $1, $2, $3}' students.txt# 在处理完所有数据后输出统计信息
$ awk '{sum += $2} END{print "Average age: " sum/NR}' students.txt# 结合 BEGIN 和 END 块
$ awk 'BEGIN{print "Start processing..."} $2 > 20 {count++} END{print "Total students over 20: " count}' students.txt

高级功能

1. 数组

# 关联数组示例
$ awk '{names[$1] = $2} END{print names["Bob"]}' students.txt# 数组遍历
$ awk '{count[$3]++} END{for(major in count) print major, count[major]}' students.txt

2. 函数

# 内置函数
$ awk '{print length($1)}' data.txt  # 计算字符串长度
$ awk '{print substr($1, 1, 3)}' data.txt  # 截取子字符串# 自定义函数
$ awk 'function max(a, b) {return a > b ? a : b} {print max($1, $2)}' numbers.txt

注意事项

  1. awk 中的变量不需要声明,直接使用即可
  2. 字符串连接使用空格,如 $1 " is " $2
  3. 正则表达式需用 / 包围
  4. 条件判断和循环语句需要用 {} 括起来
  5. BEGIN 块在处理输入前执行,END 块在处理完所有输入后执行
  6. 多个 awk 命令可以用 ; 分隔
  7. 在命令行中使用 awk 时,注意引号的使用,避免与 shell 解析冲突

总结

awk 是 Linux 系统中功能强大的文本处理工具,通过模式匹配和动作执行,可以实现复杂的文本处理任务。掌握 awk 的使用,对于数据处理、日志分析和脚本编写都非常有帮助。

http://www.xdnf.cn/news/20402.html

相关文章:

  • 工业显示器在地铁电力监控与运维中的应用
  • 每天五分钟深度学习:神经网络的梯度下降和反向传播算法
  • Python实战:爬取百度热搜榜,制作动态可视化报告
  • 企业级监控方案对比:Zabbix vs Prometheus
  • (nice!!!)(LeetCode 面试经典 150 题 ) 130. 被围绕的区域(深度优先搜索dfs || 广度优先搜索bfs)
  • uni-app倒计时公共组件 封装,倒计时组件
  • 【Next】服务端接口
  • scikit-learn零基础配置(含python、anaconda)
  • 大电流场景首选:捷多邦解析厚铜 PCB 的应用优势
  • 【PCIe EP 设备入门学习专栏 -- 8.1.2 PCIe EP 通路详细介绍】
  • v0.29.1 敏感词性能优化之内部类+迭代器内部类
  • 中州养老项目:利用Redis解决权限接口响应慢的问题
  • Pandas基础(安装、导入Pandas、读取数据、查看数据)
  • 一、算法与数据结构的本质关系:灵魂、肉体与图书馆
  • 3、工厂模式
  • redis-----事务
  • SDRAM-08 数据手册解读
  • python系列之综合项目:智能个人任务管理系统
  • HTML标签之超链接
  • 《UE5_C++多人TPS完整教程》学习笔记48 ——《P49 瞄准偏移(Aim Offset)》
  • 【LeetCode热题100道笔记】二叉搜索树中第 K 小的元素
  • Flink-新增 Kafka source 引发状态丢失导致启动失败
  • 2.2 Web和Http
  • 从0死磕全栈第五天:React 使用zustand实现To-Do List项目
  • MySQL事务日志类型及作用解析
  • Eigen中Eigen::Affine3d和Eigen::Isometry3d详解
  • 得物前端二面面经总结
  • LeetCode_数学
  • 解析、创建Excel文件的开源库OpenXLSX介绍
  • ES06-SpringData集成