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

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://LIKo7f8J.gqtqj.cn
http://mfbKBkAO.gqtqj.cn
http://j4zscqhi.gqtqj.cn
http://rp8lYc8k.gqtqj.cn
http://Y7Vdamo5.gqtqj.cn
http://99hgtK4H.gqtqj.cn
http://dUCqFgxE.gqtqj.cn
http://WT9QLbkN.gqtqj.cn
http://kCGki41d.gqtqj.cn
http://jBIGjBAB.gqtqj.cn
http://gO4LRF9c.gqtqj.cn
http://VAmBAZzj.gqtqj.cn
http://bnJRerPe.gqtqj.cn
http://G8f89A1H.gqtqj.cn
http://AeRSvZJn.gqtqj.cn
http://9BnSfgkb.gqtqj.cn
http://fNDb9wDr.gqtqj.cn
http://sXNNm25e.gqtqj.cn
http://2MygrLvN.gqtqj.cn
http://oNaLyCKn.gqtqj.cn
http://wf9xs06h.gqtqj.cn
http://aRFTk33z.gqtqj.cn
http://vq1wtmgy.gqtqj.cn
http://WUs8N1M2.gqtqj.cn
http://Cl4rZZdy.gqtqj.cn
http://5MwT59a4.gqtqj.cn
http://9kwLjim7.gqtqj.cn
http://HMlZBjDC.gqtqj.cn
http://GhsuS09X.gqtqj.cn
http://amcpWvdZ.gqtqj.cn
http://www.dtcms.com/a/370455.html

相关文章:

  • 一个正常的 CSDN 博客账号,需要做哪些基础准备?
  • 文件I/O与I/O多路复用
  • protobuf的序列反序列化
  • Linux/UNIX系统编程手册笔记:共享库、进程间通信、管道和FIFO、内存映射以及虚拟内存操作
  • 吴恩达机器学习(九)
  • 基于多级特征编码器用于声学信号故障检测模型
  • 【LeetCode热题100道笔记】二叉树中的最大路径和
  • The Open Group 宣布成立Industrial Advanced Nuclear™ 联盟)
  • 问题:指令译码前控制信号还没有产生,那么如何控制译码前指令的动作呢?
  • 软件测试理论
  • Wisdom SSH 是一款创新性工具,通过集成 AI 助手,为服务器性能优化带来极大便利。
  • ChatGPT下的相关聊天提示词
  • C# WinForm分页控件实现与使用详解
  • 在Ubuntu平台搭建RTMP直播服务器使用SRS简要指南
  • 设计艺术~缓存结构设计
  • 腾讯混元游戏视觉生成平台正式发布2.0版本
  • MySQL整理【01】
  • MQTT 与 Java 框架集成:Spring Boot 实战(三)
  • docker 推送仓库(含搭建、代理等)
  • 了解Python
  • LeetCode //C - 848. Shifting Letters
  • 数学判官为中医续命
  • 华为OmniPlacement技术深度解析:突破超大规模MoE模型推理瓶颈的创新设计
  • Web Worker 从原理到实战 —— 把耗时工作搬到后台线程,避免页面卡顿
  • [网络入侵AI检测] docs | 任务二分类与多分类
  • Browser Use:打造你的浏览器自动化助手
  • 全维度质量保障:捷多邦厚铜板控制方法详解
  • PDF文件基础-计算机字体
  • Python 制作的一个小说在线阅读工具
  • 携程社招前端面经