Linux工作台文件操作命令全流程解析(高级篇之awk精讲)
全文目录
- 1 工具介绍
- 2 核心优势
- 3 命令格式
- 3.1 命令格式说明
- 3.2 组成部分详解
- 3.2.1 选项
- 3.2.2 模式
- 3.2.3 动作
- 3.2.4 输入文件
- 4 使用说明
- 4.1 常用示例
- 4.2 awk 编程解析
- 4.2.1 基础说明
- 4.2.2 编程进阶
- 4.3 温馨提示
- 5 内置变量
- 6 参考文献
写在前面
前面一篇《Linux工作台文件操作命令全流程解析(高级篇之sed精讲)》精讲了文本流式处理工具 sed 。awk 前面也简单介绍过,但没有详细讲解过,所以本篇单独拿出来重点介绍下文本处理命令 awk ,这个命令是日常运维和处理分析日志的必备工具,掌握好它可以让我们的工作处理效率事半功倍。
1 工具介绍
awk 是一种强大的文本处理编程语言,诞生于1977年,由 Alfred Aho、Peter Weinberger 和 Brian Kernighan 三位贝尔实验室科学家联合开发(姓氏的首个字母,因此得名 AWK)。awk 逐行读入文件,以空格为默认分隔符,将每行切片,切开的部分再进行各种分析处理。awk有3个不同版本: awk、nawk和gawk,未作特别说明,一般指gawk,gawk 是 awk 的 GNU 版本。awk 拥有自己的语言,即 awk 程序设计语言 , 三位创建者已将它正式定义为“样式扫描和处理语言”。它允许您创建简短的程序,这些程序读取输入文件、为数据排序、处理数据、对输入执行计算以及生成报表等。所以, awk 不仅是命令行工具(awk是以文件的一行为处理单位的。awk每接收文件的一行,然后执行相应的命令,来处理文本),更是结构化文本处理的终极解决方案,尤其擅长处理表格数据、生成统计报告和执行复杂数据转换。
2 核心优势
- 列式数据处理:自动分割每行数据为字段(列),默认以空格/tab为分隔符,可自定义
- 数学运算与统计计算
- 复杂条件过滤:多条件组合
- 数据格式化输出(printf)
- 关联数组与数据结构处理
3 命令格式
3.1 命令格式说明
# 基本命令格式
awk [选项] '模式 {动作}' 输入文件# 使用脚本文件
awk -f 脚本文件 [选项] 输入文件
3.2 组成部分详解
3.2.1 选项
-F 分隔符:指定输入字段分隔符(如 -F’:’ 或 -F’\t’)
-v var=value:定义变量(如 -v name=John)
-f 脚本文件:从文件读取 AWK 程序
3.2.2 模式
正则匹配:/pattern/(如 /error/ 匹配包含 “error” 的行)
条件表达式:如 $3 > 25(第三列大于 25)
特殊模式:BEGIN(处理前执行)和 END(处理后执行)
逻辑组合:使用 &&(与)、||(或)连接多个条件(如 $2 == “Smith” && $3 < 30)
范围模式:模式1, 模式2(处理从匹配模式1到模式2之间的行)。
3.2.3 动作
作用域:用 {} 包裹,包含打印、计算、流程控制等语句
示例:{print $1, $3}(打印第一列和第三列)
多语句用 ; 分隔:{sum += $1; count++}
3.2.4 输入文件
多文件输入:可指定多个文件(如 file1.txt file2.txt)
不指定文件:若未指定,默认从标准输入读取
4 使用说明
4.1 常用示例
- 常规简单使用
# 打印第二列
awk '{print $2}' data.txt# 指定分隔符(如逗号)
awk -F',' '{print $2}' data.txt# 统计行数(含空行)
awk 'END {print NR}' data.txt
> 解释:NR(Number of Records)是 awk 的内置变量,表示已读取的总行数(包括所有输入文件)# 统计非空行数量
awk 'NF > 0 {count++} END {print count}' data.txt
> 解释:NF 表示当前行的字段数,空行的 NF 为 0# 统计空行数量
awk 'NF == 0 {count++} END {print count}' data.txt# 统计包含特定内容的非空行(如第一列为 "Alice" 的行)
awk 'NF > 0 && $1 == "Alice" {count++} END {print count}' data.txt# 统计行数并输出总行数与非空行数的比例
awk 'NF > 0 {non_empty++} {total++} END {printf "非空行比例: %.2f%%\n", (non_empty/total)*100}' data.txt# 统计多个文件的非空行数并标记来源
awk 'NF > 0 {count[FILENAME]++} END {for(file in count) print file, count[file]}' file*.txt# 条件过滤(第三列大于 25)
awk '$3 > 25 {print $0}' data.txt# 变量传递
awk -v name="John" '$1 == name {print $3}' data.txt# 计算和与均值
awk '{sum += $3} END {print "Sum:", sum, "Avg:", sum/NR}' data.txt
- BEGIN/END 块
# 以“:”为输入分隔符,“,”为输出分隔符,整理打印用户配置文件,输出用户名和用户ID所在的列内容
awk 'BEGIN {FS=":"; OFS=","} {print $1, $3} END {print "Done"}' /etc/passwd
命令格式:
awk 'BEGIN {初始化动作} 模式 {动作} END {结束动作}' 输入文件
- BEGIN 块:在处理输入文件前执行一次,用于初始化设置
- 中间的模式和动作:逐行处理输入文件时执行
- END 块:处理完所有输入行后执行一次
- BEGIN/END 块 - 拓展
# 添加条件过滤(例如仅输出用户 ID ≥ 1000 的用户)
awk 'BEGIN {FS=":"; OFS=","} $3 >= 1000 {print $1, $3} END {print "Done"}' /etc/passwd# 输出到文件
awk 'BEGIN {FS=":"; OFS=","} {print $1, $3} END {print "Done"}' /etc/passwd > users.csv# 添加表头
awk 'BEGIN {FS=":"; OFS=","; print "Username,UID"} {print $1, $3} END {print "Done"}' /etc/passwd
4.2 awk 编程解析
4.2.1 基础说明
- print和printf
awk中同时提供了print和printf两种打印输出的函数。print函数的参数可以是变量、数值或者字符串。字符串必须用双引号引用,参数用逗号分隔。如果没有逗号,参数就串联在一起而无法区分。逗号的作用与输出文件的分隔符的作用是一样的,只是后者是空格而已。printf函数,其用法和c语言中printf基本相似,可以格式化字符串,输出复杂时,printf更加好用,代码更易懂。
- 变量和赋值
除了内置变量,awk也可以自定义变量。
# 统计/etc/passwd的账户人数
awk'{count++;print $0;} END{print "user count is ", count}' /etc/passwd # 无初始化
awk'BEGIN {count=0;print "[start]user count is ", count} {count=count+1;print $0;} END{print "[end]user count is ", count}' /etc/passwd # 初始化变量
> count是自定义变量。之前的action{}里都是只有一个print,其实print只是一个语句,而action{}可以有多个语句,以;号隔开
- 条件语句
awk中的条件语句是从C语言中借鉴来的,声明方式如下:
# if 语句
if (expression) {statement;statement;... ...
}# if|else 语句
if (expression) {statement;
} else {statement2;
}# if|elseif|else 语句
if (expression) {statement1;
} elseif (expression1) {statement2;
} else {statement3;
}
# 统计某个文件夹下的文件占用的字节数,过滤4096大小的文件(一般是文件夹):
ls -l |awk'BEGIN {size=0;print "[start]size is ", size} {if($5!=4096){size=size+$5;}} END{print "[end]size is ", size/1024/1024,"M"}'
- 循环语句
awk中循环语句同样借鉴于C语言,支持while、do/while、for、break、continue,关键字语义和C语言语义完全相同
- 数组
数组和变量一样,都是在使用时自动创建的,awk也同样会自动判断其存储的是数字还是字符串。一般而言,awk中的数组用来从记录中收集信息,可以用于计算总和、统计单词以及跟踪模板被匹配的次数等等
# 显示/etc/passwd的账户
awk -F ':''BEGIN {count=0;} {name[count] = $1;count++;}; END{for (i = 0; i < NR; i++) print i, name[i]}' /etc/passwd
4.2.2 编程进阶
- 字段处理黑科技
# 动态字段处理(修改第二列为哈希值)
awk '{cmd = "echo " $2 " | sha256sum | cut -d\" \" -f1"cmd | getline hashclose(cmd)$2 = substr(hash,1,8)
}1' data.txt# 字段重排(按指定顺序输出)
BEGIN { order[3]=1; order[1]=2; order[2]=3 }
{ for(i=1;i<=NF;i++) printf "%s:%s ", order[i], $i; print "" }# 处理CSV(处理带逗号的字段)
awk -v FPAT='([^,]+)|("[^"]+")' '{print $3}' complex.csv
> FPAT(Field Pattern)是 GNU AWK 的扩展功能,允许通过正则表达式直接定义字段的匹配模式(而非传统分隔符 FS)。当字段包含特殊字符(如逗号)或被引号包裹时,FPAT 比 FS 更适合处理复杂结构
> 正则表达式 ([^,]+)|("[^"]+"):
> [^,]+:匹配一个或多个非逗号的字符(普通字段)。
> "[^"]+":匹配被双引号包裹的内容(字段内容可含逗号)。
> |:逻辑“或”操作,优先匹配左侧模式,若失败则尝试右侧模式。
- 结构化输出
# 格式化表格输出
awk 'BEGIN {printf "%-20s %10s\n","Name","Salary"}{printf "%-20s %'10'd\n", $1, $2}' employees.txt# 生成JSON数据
awk 'BEGIN {print "["}NR>1 {printf " {\"id\":%d,\"name\":\"%s\"},\n", $1, $2}END {print "{}]\n"}' data.txt
- 日志分析
# 统计Nginx访问日志
awk '{status[$9]++total++if($9 >= 500) err500++if($9 == 404) {not_found[$7]++}
}
END {print "总请求:", totalprint "状态码分布:"for(s in status) print s, status[s]print "\n500错误率:", err500/total*100 "%"print "\n404高频资源:"for(url in not_found) print url, not_found[url]
}' access.log
- 数据清洗
# 规范化电话号码格式
awk '{gsub(/[^0-9]/, "", $3) # 去除非数字字符if(length($3)==11) $3 = substr($3,1,3)"-"substr($3,4,4)"-"substr($3,8)print
}' contacts.txt
- 实时监控
# 实时内存警报
while true; dofree -m | awk '/Mem:/ {if($3/$2*100 > 90) system("echo 内存告警 | mail -s 'ALERT' admin@example.com")}'sleep 60
done
4.3 温馨提示
- 引号规则:程序部分用单引号 ’ ’ 包裹,避免 Shell 解析特殊字符
- 字段处理:默认以空格/制表符分隔字段,连续空格视为单个分隔符
- 高级功能:支持数组、函数等(如 length($0) 计算行长度)
5 内置变量
变量 | 作用 | 默认值 |
---|---|---|
FS | 输入字段分隔符 | 空格/制表符 |
OFS | 输出字段分隔符 | 空格 |
RS | 输入记录分隔符 | \n |
ORS | 输出记录分隔符 | \n |
NR | 已读取的总行数 | - |
FNR | 当前文件已读取的行数 | - |
NF | 当前行的字段数 | - |
FILENAME | 当前处理的文件名 | - |
ARGC | 命令行参数个数 | - |
ARGV | 命令行参数数组 | - |
ENVIRON | 环境变量的关联数组 | 举例:awk 'BEGIN{print ENVIRON["PATH"]}' |
CONVFMT | 数字转换为字符串的格式 | %.6g |
OFMT | 数字输出的格式 | %.6g |
6 参考文献
文献1|文献2|文献3|文献4|GNU AWK手册
写在最后
文章由简入深介绍了 awk 文件处理工具,希望给读者有一个整体认知,用系统化的思路去认识 awk,希望可以帮助到读者。 如有任何问题,欢迎评论区指正与点评,同时,觉得对你有帮助,也欢迎点赞与收藏。我们共同努力,一起进步!
相关文章:
Linux工作台文件操作命令全流程解析(高级篇之awk精讲)
全文目录 1 工具介绍2 核心优势3 命令格式3.1 命令格式说明3.2 组成部分详解3.2.1 选项3.2.2 模式3.2.3 动作3.2.4 输入文件 4 使用说明4.1 常用示例4.2 awk 编程解析4.2.1 基础说明4.2.2 编程进阶 4.3 温馨提示 5 内置变量6 参考文献 写在前面 前面一篇《Linux工作台文件操作命…...

力扣119题:杨辉三角II(滚动数组)
小学生一枚,自学信奥中,没参加培训机构,所以命名不规范、代码不优美是在所难免的,欢迎指正。 标签: 杨辉三角、滚动数组 语言: C 题目: 给定一个非负索引 rowIndex,返回「杨辉三角…...
c++:算法(Algorithms)
目录 常用 STL 算法 1️⃣ std::sort(排序) 2️⃣ std::find(查找等于某值的元素) 3️⃣ std::count(统计出现次数) 4️⃣ std::next(获取迭代器的下一个位置) 5️⃣ .erase(…...

大疆无人机(全系列,包括mini)拉流至电脑,实现直播
参考视频 【保姆级教程】大疆无人机rtmp推流直播教程_哔哩哔哩_bilibili VLC使用教程: VLC工具使用指南-CSDN博客 目录 实现效果: 电脑端 编辑 编辑 无人机端 VLC拉流 分析 实现效果: (实验机型:大疆mini4kRC-N2遥控器、大…...

uniapp-商城-54-后台 新增商品(页面布局)
后台页面中还存在商品信息的添加和修改等。接下来我们逐步进行分析和展开。包含页面布局和数据库逻辑等等。 1、整体效果 样式效果如下,依然采用了表单形式来完成和商家信息差不多,但在商品属性上多做了一些弹窗等界面,样式和功能点表多。 …...
深入浅出MySQL 8.0:新特性与最佳实践
MySQL作为开源关系型数据库的佼佼者,近年来持续更新迭代,尤其是在8.0版本中引入了一系列令人兴奋的新特性。本文将介绍一些MySQL 8.0的关键新功能,并提供最佳实践,旨在帮助开发人员和DBA更好地利用这一强大的数据库管理系统。 一…...
JIT+Opcache如何配置才能达到性能最优
首先打开php.ini文件,进行配置 1、OPcache配置 ; 启用OPcache opcache.enable1; CLI环境下启用OPcache(按需配置) opcache.enable_cli0; 预加载脚本(PHP 7.4,加速常用类) ; opcache.preload/path/to/prel…...
(2)python开发经验
文章目录 1 pyside6加载ui文件2 使用pyinstaller打包 更多精彩内容👉内容导航 👈👉Qt开发 👈👉python开发 👈 1 pyside6加载ui文件 方法1: 直接加载ui文件 from PySide6.QtWidgets import QAp…...

WebpackVite总结篇与进阶
模块化 Webpack Webpack 入口entry 分离app和第三方库入口 这是什么? 这是告诉 webpack 我们想要配置 2 个单独的入口点(例如上面的示例)。 为什么? 这样你就可以在 vendor.js 中存入未做修改的必要 library 或文件࿰…...

【python】基础知识点100问
以下是Python基础语法知识的30条要点整理,涵盖数据类型、函数、控制结构等核心内容,结合最新资料归纳总结: 基础30问 一、函数特性 函数多返回值 支持用逗号分隔返回多个值,自动打包为元组,接收时可解包到多个变量 def func(): return 1, "a" x, y = func()匿…...
uniapp 百家云直播插件打包失败
打包错误日志 Android自有证书 打包失败 错误日志: https://app.liuyingyong.cn/build/errorLog/cf41a610-effe-11ef-88db-05262d4c3e5d原因:需要导入插件依赖 依赖地址:https://ext.dcloud.net.cn/plugin?id16289 百家云直播插件地址 直播插…...

SpringBoot--springboot简述及快速入门
spring Boot是spring提供的一个子项目,用于快速构建spring应用程序 传统方式: 在众多子项目中,spring framework项目为核心子项目,提供了核心的功能,其他的子项目都需要依赖于spring framework,在我们实际…...

vscode_python远程调试_pathMappings配置说明
1.使用说明 vscode python 远程调试pathMappings 配置 launch.json "pathMappings": [{"localRoot": "本地代码目录","remoteRoot": "远程代码目录" # 注意不是运行目录, 是远程代码的目录}],2.测试验证 测试目的: 远程代…...

遨游5G-A防爆手机:赋能工业通信更快、更安全
在工业数字化转型与5G-A商用进程加速的双重驱动下,中国防爆手机市场正迎来历史性发展机遇。作为“危、急、特”场景通信解决方案服务商,遨游通讯深刻洞察到:当5G-A网络以超高速率、海量连接和毫秒级时延重塑行业生态时,防爆手机这…...

Profibus DP主站与Modbus RTU/TCP网关与海仕达变频器轻松实现数据交互
Profibus DP主站与Modbus RTU/TCP网关与海仕达变频器轻松实现数据交互 Profibus DP主站转Modbus RTU/TCP(XD-MDPBm20)网关在Profibus总线侧实现主站功能,在Modbus串口侧实现从站功能。可将ProfibusDP协议的设备(如:海…...
C++八股——智能指针
文章目录 1. 背景2. 原理与使用2.1 auto_ptr2.2 unique_ptr2.3 shared_ptr2.4 weak_ptr2.5 定制删除器 1. 背景 智能指针不是指针,是一个管理指针的类,用来存储指向动态分配对象的指针,负责自动释放动态分配的对象,防止堆内存泄漏…...

「华为」人形机器人赛道投资首秀!
温馨提示:运营团队2025年最新原创报告(共210页) —— 正文: 近日,【华为】完成具身智能赛道投资首秀,继续加码人形机器人赛道布局。 2025年3月31日,具身智能机器人头部创企【千寻智能&#x…...

格雷希尔G10和G15系列自动化快速密封连接器,适用于哪些管件的密封,以及它们相关的特性有哪些?
格雷希尔G10和G15系列快速密封连接器,用于自动化和半自动化过程中的外部或内部密封,通过使用气压驱动来挤压内部的密封圈,创造一个适用于各种管件的无泄漏密封连接,连接器内部的弹性密封圈可以提供其他产品不能提供的卓越密封性能…...
mac一键安装gpt-sovit教程中,homebrew卡住不动的问题
mac一键安装gpt-sovit教程 仅作为安装过程中解决homebrew卡住问题的记录 资源地址 https://www.yuque.com/baicaigongchang1145haoyuangong/ib3g1e/znoph9dtetg437xb#mlAoP 下载一键包 下载后并解压,找到install for mac.sh,终端执行bash空格拖拽in…...

专栏特辑丨悬镜浅谈开源风险治理之SBOM与SCA
随着容器、微服务等新技术日新月异,开源软件成为业界主流形态,软件行业快速发展。但同时,软件供应链也越来越趋于复杂化和多样化,软件供应链安全风险不断加剧。 软件供应链安全主要包括软件开发生命周期和软件生存运营周期&#x…...

vue3项目创建-配置-elementPlus导入-路由自动导入
目录 方法一:create-vue 方法二 :Vite Vue Vite.config.ts配置 引入element-plus 安装 如何在项目中使用 Element Plus 完整引入 按需导入 vue3vite中自动配置路由的神器:vite-plugin-pages 1. 安装 2、修改vite.config.js中配置…...

MUSE Pi Pro 编译kernel内核及创建自动化脚本进行环境配置
视频讲解: MUSE Pi Pro 编译kernel内核及创建自动化脚本进行环境配置 今天分享的主题为创建自动化脚本编译MUSE Pi Pro的kernel内核,脚本已经上传到中 GitHub - LitchiCheng/MUSE-Pi-Pro-Learning: MUSE-Pi-Pro-Learning ,有需要可以自行clon…...
Java大师成长计划之第20天:Spring Framework基础
📢 友情提示: 本文由银河易创AI(https://ai.eaigx.com)平台gpt-4o-mini模型辅助创作完成,旨在提供灵感参考与技术分享,文中关键数据、代码与结论建议通过官方渠道验证。 在Java开发领域,Spring …...

Innovus 25.1 版本更新:助力数字后端物理设计新飞跃
在数字后端物理设计领域,每一次工具的更新迭代都可能为项目带来巨大的效率提升与品质优化。今天,就让我们一同聚焦 Innovus 25.1 版本(即 25.10 版本)的更新要点,探寻其中蕴藏的创新能量。 一、核心功能的强势进 AI…...
FastAPI 和 MongoDB 实现请求头参数处理的示例,并在 React 中进行渲染
FastAPI 和 MongoDB 后端 安装必要的库 安装 FastAPI、Uvicorn、Motor(用于 MongoDB 的异步驱动)和 Pydantic(用于数据验证)。 pip install fastapi uvicorn motor pydantic创建 FastAPI 应用 创建一个文件 main.py,并…...

CodeBuddy 中国版 Cursor 实战:Redis+MySQL双引擎驱动〈王者荣耀〉战区排行榜
文章目录 一、引言二、系统架构设计2.1、整体架构概览2.2、数据库设计2.3、后端服务设计 三、实战:从零构建排行榜3.1、开发环境准备3.2、用户与战区 数据管理3.2.1、MySQL 数据库表创建3.2.2、实现用户和战区数据的 CURD 操作 3.3、实时分数更新3.4、排行榜查询3.5…...
码蹄集——分解、数组最大公约数、孪生质数、卡罗尔数、阶乘数
MT1158 分解 输入正整数N和M,判断N是否可以分解成M个不同的正整数的和,输出YES或者NO。 格式 输入格式:输入正整数N和M,空格分隔 输出格式:输出YES或者NO 样例 1 输入:5 2 输出:YES 思路…...
【React中函数组件和类组件区别】
在 React 中,函数组件和类组件是两种构建组件的方式,它们在多个方面存在区别,以下详细介绍: 1. 语法和定义 类组件:使用 ES6 的类(class)语法定义,继承自 React.Component。需要通过 this.props 来访问传递给组件的属性(props),并且通常要实现 render 方法返回 JSX…...
Idea Code Templates配置
Templates配置 配置位置模板案例 配置位置 Settings->Editor->File and Code Templates模板案例 #if (${PACKAGE_NAME} && ${PACKAGE_NAME} ! "")package ${PACKAGE_NAME};#endimport com.ktools.common.dataprocess.DataProcess; import com.ktools…...

在线SQL转ER图工具
在线SQL转ER图网站 在数据库设计、软件开发或学术研究中,ER图(实体-关系图) 是展示数据库结构的重要工具。然而,手动绘制ER图不仅耗时费力,还容易出错。今天,我将为大家推荐一款非常实用的在线工具——SQL…...