【基础】每天掌握一个Linux命令 - awk
目录
- 【基础】每天掌握一个Linux命令 - awk
- 一、工具概述
- 二、安装方式
- Ubuntu/Debian系统:
- CentOS/RHEL系统:
- macOS系统:
- 三、核心功能
- 四、基础用法
- 基本语法
- 常用选项
- 内置变量
- 基本操作示例
- 1. 打印文件所有内容
- 2. 打印每行的第一个字段
- 3. 指定分隔符为冒号(:),打印每行的第三个字段
- 4. 打印包含特定字符串的行
- 5. 打印行数
- 6. 打印字段数最多的行
- 7. 计算所有数字的总和
- 8. 打印每行的字段数
- 五、进阶操作
- 1. 使用条件表达式筛选数据
- 示例数据 (students.txt):
- 打印数学成绩大于80的学生
- 计算并打印每个学生的平均分
- 2. 使用循环处理数据
- 打印每个学生的所有成绩
- 3. 多文件处理
- sales1.txt:
- sales2.txt:
- 计算每个产品的总销售额
- 4. 格式化输出
- 按列对齐输出学生成绩和平均分
- 5. 内置函数应用
- 字符串处理示例:转换为大写
- 数学函数示例:计算平方根
- 六、实战案例
- 1. 面试题实战
- 题目:统计日志文件中每个IP的访问次数,并按次数降序排列
- 题目:提取日志中状态码为404的URL
- 2. 生产场景实战
- 案例1:监控服务器负载
- 案例2:分析系统日志
- 案例3:处理CSV文件
- 3. 文本处理实战
- 案例1:提取HTML标签内容
- 案例2:批量重命名文件
- 七、注意事项
【基础】每天掌握一个Linux命令 - awk
在Linux的世界里,当你面对海量数据需要筛选、统计时,awk就像是一把精准的手术刀,能迅速定位并处理你需要的信息。简单来说,它是一个强大的文本分析工具,让你无需编写复杂的程序,就能轻松完成数据提取与转换,特别适合处理格式化文本,如日志文件、CSV表格等。
一、工具概述
awk是一种优良的文本处理工具,Linux及Unix环境中现有的功能最强大的数据处理引擎之一。其名称得自于它的创始人 Alfred Aho、Peter Weinberger 和 Brian Kernighan 姓氏的首个字母。awk程序设计语言,包括正则表达式、循环、变量等,支持用户自定义函数和动态正则表达式等先进功能,是数据处理和报表生成的理想工具。
二、安装方式
在大多数Linux发行版中,awk通常已经预装。如果需要检查是否安装,可以使用以下命令:
awk --version
如果系统中没有安装,可以使用包管理器进行安装:
Ubuntu/Debian系统:
sudo apt-get install gawk
CentOS/RHEL系统:
sudo yum install gawk
macOS系统:
brew install gawk
三、核心功能
功能分类 | 功能描述 |
---|---|
文本处理 | 逐行读取文本并按指定规则处理,可结合正则表达式进行模式匹配 |
数据提取 | 根据字段分隔符分割每行文本,提取特定字段内容 |
格式化输出 | 按照指定格式输出处理后的数据,支持对齐、填充等 |
统计分析 | 计算总和、平均值、最大值、最小值等统计信息 |
条件判断 | 根据条件表达式筛选符合条件的记录 |
循环处理 | 支持for、while等循环结构,处理复杂数据 |
自定义函数 | 允许用户创建自定义函数扩展功能 |
文件操作 | 可以读取和处理多个输入文件,支持输出到文件 |
四、基础用法
基本语法
awk [选项] '模式{动作}' 文件1 文件2 ...
常用选项
选项 | 描述 |
---|---|
-F fs | 指定输入文件的字段分隔符,fs为分隔符字符串 |
-v var=val | 定义或设置变量var的值为val |
-f file | 从文件file中读取awk脚本,而不是在命令行中直接输入 |
-W option | 指定GNU awk特定的选项,如–lint检查语法错误 |
–help | 显示帮助信息 |
内置变量
变量 | 描述 |
---|---|
$0 | 当前处理的行的整行内容 |
1 − 1- 1−n | 当前行被分割后的第1到第n个字段 |
NF | 当前行的字段数量 |
NR | 到目前为止已处理的行数 |
FNR | 当前文件已处理的行数 |
FS | 输入字段分隔符,默认是空格或制表符 |
OFS | 输出字段分隔符,默认是空格 |
RS | 输入记录分隔符,默认是换行符 |
ORS | 输出记录分隔符,默认是换行符 |
FILENAME | 当前输入文件的名称 |
ARGC | 命令行参数的数量 |
ARGV | 命令行参数数组 |
基本操作示例
1. 打印文件所有内容
awk '{print}' filename.txt
2. 打印每行的第一个字段
awk '{print $1}' filename.txt
3. 指定分隔符为冒号(😃,打印每行的第三个字段
awk -F: '{print $3}' /etc/passwd
4. 打印包含特定字符串的行
awk '/pattern/{print}' filename.txt
5. 打印行数
awk 'END{print NR}' filename.txt
6. 打印字段数最多的行
awk '{if(NF>max) max=NF; maxline=$0} END{print maxline}' filename.txt
7. 计算所有数字的总和
awk '{sum+=$1} END{print sum}' numbers.txt
8. 打印每行的字段数
awk '{print NF}' filename.txt
五、进阶操作
1. 使用条件表达式筛选数据
示例数据 (students.txt):
Alice 85 90 78
Bob 76 88 92
Charlie 92 89 95
David 65 70 68
打印数学成绩大于80的学生
awk '$2 > 80 {print $1, $2}' students.txt
输出结果:
Alice 85
Charlie 92
计算并打印每个学生的平均分
awk '{avg=($2+$3+$4)/3; print $1, avg}' students.txt
输出结果:
Alice 84.3333
Bob 85.3333
Charlie 92
David 67.6667
2. 使用循环处理数据
打印每个学生的所有成绩
awk '{for(i=2; i<=NF; i++) print $1, "subject", i-1, ":", $i}' students.txt
输出结果:
Alice subject 1 : 85
Alice subject 2 : 90
Alice subject 3 : 78
Bob subject 1 : 76
Bob subject 2 : 88
Bob subject 3 : 92
Charlie subject 1 : 92
Charlie subject 2 : 89
Charlie subject 3 : 95
David subject 1 : 65
David subject 2 : 70
David subject 3 : 68
3. 多文件处理
假设有两个文件:sales1.txt
和 sales2.txt
,内容如下:
sales1.txt:
ProductA 100 15
ProductB 200 20
sales2.txt:
ProductA 150 18
ProductC 300 25
计算每个产品的总销售额
awk '{total[$1] += $2 * $3} END{for(product in total) print product, total[product]}' sales1.txt sales2.txt
输出结果:
ProductA 4200
ProductB 4000
ProductC 7500
4. 格式化输出
按列对齐输出学生成绩和平均分
awk '{avg=($2+$3+$4)/3; printf "%-10s %3d %3d %3d %6.2f\n", $1, $2, $3, $4, avg}' students.txt
输出结果:
Alice 85 90 78 84.33
Bob 76 88 92 85.33
Charlie 92 89 95 92.00
David 65 70 68 67.67
5. 内置函数应用
字符串处理示例:转换为大写
awk '{print toupper($1)}' students.txt
输出结果:
ALICE
BOB
CHARLIE
DAVID
数学函数示例:计算平方根
awk '{print sqrt($2)}' numbers.txt
六、实战案例
1. 面试题实战
题目:统计日志文件中每个IP的访问次数,并按次数降序排列
示例日志 (access.log):
192.168.1.1 - - [01/Jan/2023:00:00:01 +0800] "GET /index.html HTTP/1.1" 200 1234
192.168.1.2 - - [01/Jan/2023:00:00:02 +0800] "GET /index.html HTTP/1.1" 200 1234
192.168.1.1 - - [01/Jan/2023:00:00:03 +0800] "GET /about.html HTTP/1.1" 200 1234
解决方案:
awk '{count[$1]++} END{for(ip in count) print ip, count[ip]}' access.log | sort -k2 -nr
输出结果:
192.168.1.1 2
192.168.1.2 1
题目:提取日志中状态码为404的URL
解决方案:
awk '$9 == "404" {print $7}' access.log
2. 生产场景实战
案例1:监控服务器负载
需求: 实时监控服务器的CPU使用率,当超过80%时发出警告
解决方案:
top -bn1 | grep "Cpu(s)" | awk '{print $2 + $4}' | awk '{if($1 > 80) print "CPU警告: 当前使用率为", $1, "%"}'
案例2:分析系统日志
需求: 统计/var/log/syslog中出现次数最多的5个程序
解决方案:
grep -oP '\[\K[^]]+' /var/log/syslog | awk '{count[$1]++} END{for(prog in count) print count[prog], prog}' | sort -nr | head -5
案例3:处理CSV文件
需求: 从销售数据中计算每个地区的总销售额
示例数据 (sales.csv):
Region,Product,Amount
North,ProductA,1000
South,ProductB,1500
North,ProductC,2000
解决方案:
awk -F',' 'NR>1 {total[$1]+=$3} END{for(region in total) print region, total[region]}' sales.csv
输出结果:
North 3000
South 1500
3. 文本处理实战
案例1:提取HTML标签内容
需求: 从HTML文件中提取所有链接
解决方案:
awk -v RS='</a>' '/<a / {match($0, /href="[^"]+"/); print substr($0, RSTART+6, RLENGTH-7)}' index.html
案例2:批量重命名文件
需求: 将所有.jpg文件重命名为JPG后缀
解决方案:
ls *.jpg | awk -F. '{print "mv", $0, $1 ".JPG"}' | sh
七、注意事项
-
字段分隔符问题:默认情况下,awk使用空格或制表符作为字段分隔符。如果数据中包含多个连续空格,可能会导致字段分割不准确。此时应使用
-F
选项明确指定分隔符。 -
变量区分大小写:awk中的变量区分大小写,例如
var
和Var
是不同的变量。 -
正则表达式陷阱:在awk中使用正则表达式时,需要注意元字符的转义问题。例如,要匹配点号(.),需要使用
\.
。 -
性能考虑:虽然awk是处理文本的强大工具,但在处理超大型文件时,性能可能会成为问题。此时应考虑使用更高效的工具或优化awk脚本。
-
BEGIN和END块:BEGIN块在处理输入文件之前执行,END块在处理完所有输入文件后执行。这两个块是可选的,但在需要初始化变量或输出汇总信息时非常有用。
-
内置函数限制:不同版本的awk可能支持不同的内置函数。在使用特定函数之前,最好先查阅对应版本的文档。
-
文件读取顺序:当处理多个输入文件时,awk会按命令行中指定的顺序依次处理每个文件。FNR变量会在每个文件开始时重置,而NR变量会继续递增。
-
字符串和数值比较:awk会自动识别变量的类型,但在进行比较时需要注意类型转换问题。例如,字符串"10"在数值比较时会被转换为数字10。
-
命令行参数限制:如果需要传递大量参数给awk,可能会遇到系统命令行长度限制的问题。此时应考虑将参数存储在文件中,然后使用
-f
选项读取。 -
错误处理:在编写复杂的awk脚本时,建议使用
-W lint
选项检查语法错误,确保脚本的正确性。
相关文章:
【基础】每天掌握一个Linux命令 - awk
目录 【基础】每天掌握一个Linux命令 - awk一、工具概述二、安装方式Ubuntu/Debian系统:CentOS/RHEL系统:macOS系统: 三、核心功能四、基础用法基本语法常用选项内置变量基本操作示例1. 打印文件所有内容2. 打印每行的第一个字段3. 指定分隔符…...

《UE5_C++多人TPS完整教程》学习笔记37 ——《P38 变量复制(Variable Replication)》
本文为B站系列教学视频 《UE5_C多人TPS完整教程》 —— 《P38 变量复制(Variable Replication)》 的学习笔记,该系列教学视频为计算机工程师、程序员、游戏开发者、作家(Engineer, Programmer, Game Developer, Author)…...

AWS API Gateway配置日志
问题 访问API Gateway接口出现了403问题,具体报错如下: {"message":"Missing Authentication Token"}需要配置AWS API Gateway日志,看请求过程是什么样子的。 API Gateway 先找到API Gateway的的日志角色,…...

Towards Open World Object Detection概述(论文)
论文:https://arxiv.org/abs/2103.02603 代码:https://github.com/JosephKJ/OWOD Towards Open World Object Detection 迈向开放世界目标检测 Abstract 摘要 Humans have a natural instinct to identify unknown object instances in their environ…...

轻松备份和恢复 Android 系统 | 4 种解决方案
我们通常会在 Android 手机上存储大量重要的个人数据,包括照片、视频、联系人、信息等等。如果您不想丢失宝贵的数据,可以备份 Android 数据。当您需要访问和使用这些数据时,可以将其恢复到 Android 设备。如果您想了解 Android 备份和恢复&a…...

具备强大的数据处理和分析能力的智慧地产开源了
智慧地产视觉监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒,省去繁琐重复的适配流程,实现芯片、算法、应用的全流程组合,从而大大减少企业级应用约95%的开发成本。 AI是新形势下数…...
RK3588和FPGA桥片之间IO电平信号概率性不能通信原因
1.GPIO管脚配置问题 RK3588对IO进行配置的时候,如果配置为多功能复用,没有明确IO功能,可能引起信号接收不稳定, 需要在驱动中设备树中配置管脚为GPIO功能,确保没有功能复用的干扰。 2.上下拉电阻阻值设置不当 GPIO引脚…...

【iSAQB软件架构】软件架构中构建块的视图:黑箱、灰箱和白箱及其交互机制
在软件架构描述中,黑箱视图(Black-box)、灰箱视图(Gray-box)和白箱视图(White-box) 是不同抽象层级的构建模块表示方式,用于满足不同受众和设计阶段的需求。以下是基于ISAQB标准的清…...
.net jwt实现
.NET 中实现 JWT 认证:详细指南 在现代的 Web 应用开发中,安全认证是至关重要的一环。JSON Web Token(JWT)作为一种广泛使用的认证机制,为 API 提供了安全、便捷的身份验证方式。本文将详细介绍如何在 ASP.NET Core 项…...
LangChain【7】之工具创建和错误处理策略
文章目录 一 LangChain 自定义工具概述二创建自定义工具的三种方法2.1 方法一:tool 装饰器2.1.1 同步方法案例2.1.2 工具描述方式1:传参2.1.3 工具描述方式2:文档字符串 2.2 方法二:StructuredTool类2.2.1 StructuredTool创建自定…...

如何在电脑上轻松访问 iPhone 文件
我需要将 iPhone 下载文件夹中的文件传输到 Windows 11 电脑上。我该怎么做?我可以在 Windows 11 上访问 iPhone 下载吗? 由于 iOS 和 Windows 系统之间的差异,在 PC 上访问 iPhone 文件似乎颇具挑战性。然而,只要使用正确的工具…...
Eureka REST 相关接口
可供非 Java 应用程序使用的 Eureka REST 操作。 appID 是应用程序的名称,instanceID 是与实例关联的唯一标识符。在 AWS 云中,instanceID 是实例的实例 ID;在其他数据中心,它是实例的主机名。 对于 XML/JSON,HTTP 的…...

C语言字符数组输入输出方法大全(附带实例)
在 C语言中,字符数组是一种特殊的数组,用于存储和处理字符串。理解字符数组的输入和输出操作对于初学者来说至关重要,因为这是处理文本数据的基础。 字符数组的定义与初始化 在讨论输入输出之前,我们先来回顾一下字符数组的定义…...

短视频矩阵SaaS系统:开源部署与核心功能架构指南
一、系统架构概述 短视频矩阵系统是基于SaaS(软件即服务)模式的多平台内容管理解决方案,通过开源技术实现账号聚合、智能创作、跨平台分发及数据闭环。系统采用微服务架构,支持高并发场景下的弹性扩展。 二、核心功能模块开发逻辑…...
每日算法 -【Swift 算法】电话号码字母组合
🚀 LeetCode 字符串数字映射(Swift)——电话号码字母组合 在日常刷题或面试中,我们经常会遇到字符串 回溯组合的问题。这道经典题——电话号码的字母组合 就是典型代表。本文将带你用 Swift 实现这道题,思路清晰&…...
深入解析YUM与DNF:RPM包管理器的架构演进与功能对比
在Linux系统管理中,软件包管理器是连接用户与底层RPM(Red Hat Package Manager)包的核心工具。作为RPM生态的两大代表性工具,YUM(Yellowdog Updater Modified)与DNF(Dandified YUM)的…...
解决cocos 2dx/creator2.4在ios18下openURL无法调用的问题
由于ios18废弃了旧的openURL接口,我们需要修改CCApplication-ios.mm文件的Application::openURL方法: //修复openURL在ios18下无法调用的问题 bool Application::openURL(const std::string &url) {// NSString* msg [NSString stringWithCString:…...
精益数据分析(94/126):30/10/10用户参与法则与定价策略的科学制定
精益数据分析(九十四):30/10/10用户参与法则与定价策略的科学制定 在创业过程中,如何衡量用户参与度是否健康?又该如何制定科学的定价策略实现营收最大化?今天,我们将深入解析Union Square Ven…...

oss:上传图片到阿里云403 Forbidden
访问图片出现403Forbidden问题,我们可以直接登录oss账号,查看对应权限是否开通,是否存在跨域问题...
Windows系统中如何使用符号链接将.vscode等配置文件夹迁移到D盘(附 CMD PowerShell 双版本命令)
在日常开发和使用中,很多应用程序都会在 Windows 用户目录(如 C:\Users\你的用户名\)下创建一些以点开头的隐藏配置文件夹,例如: .vscode — Visual Studio Code 的设置和插件数据.cursor — Cursor 编辑器的缓存和设…...

4. 数据类型
4.1 数据类型分类 分类 数据类型 说明 数值类型 BIT(M) 位类型。M指定位数,默认值1,范围1 - 64 TINYINT [UNSIGNED] 带符号的范围 -128 ~ 127,无符号范围0 ~ 255,默认有符号 BOOL 使用0和1表示真和假 SMALLINT [UNSIGNED] 带符号是…...

MySQL基础(二)SQL语言、客户端工具
目录 三、SQL语言 3.1 概念 3.2 基本操作 四、客户端工具 三、SQL语言 3.1 概念 SQL(Structured Query Language)结构化查询语言。SQL用于对存储数据,更新,查询和管理关系型数据库的程序设计语言。 通常执行对数据库的增删改…...
【贪心、DP、线段树优化】Leetcode 376. 摆动序列
贪心算法:选 “关键转折点” 初始状态:把数组第一个元素当作起点,此时前一个差值符号设为平坡(即差值为0)。遍历数组:从第二个元素开始,依次计算当前元素和前一个元素的差值。差值符号判断&…...

CppCon 2015 学习:C++ in the audio industry
实时编程(real-time programming):音频处理对延迟极度敏感,要求代码必须非常高效且稳定。无锁线程同步(lock-free thread synchronization):避免阻塞,提高性能,尤其是在多…...

C++算法-动态规划2
第 4 题 字符串分割 (Word Break) 难度: Medium备注:出自 leetcode题目描述 Given a string s and a dictionary of words dict, determine if s can be segmented into a space-separated sequence of one or more dictionary words. For example, given s "l…...

软信天成:数据驱动型背后的人工智能,基于机器学习的数据管理
在数字化转型浪潮中,当代企业如同逆水行舟,不进则退。无数企业希望通过数字化转型捕获全新的市场机遇,改善财政状况,在未来市场竞争中占据一席之地。要想获得成功的数字化转型,关键因素在于具备可靠、及时的数据用以支…...

MySQL提升
事务 事务:在多个操作合在一起视为一个整体。要么就不做、要么就做完。 事务应该满足ACID A : 原子性。不可分割。C : 一致性。追求的目标,在开始到结束没有发生预定外的情况。I : 隔离性。不同的事务是独立的。D : 持久性。系统崩溃,数据依然…...
hbase资源和数据权限控制
hbase适合大数据量下点查 https://zhuanlan.zhihu.com/p/471133280 HBase支持对User、NameSpace和Table进行请求数和流量配额限制,限制频率可以按sec、min、hour、day 对于请求大小限制示例(5K/sec,10M/min等),请求大小限制单位如…...
VMWare下设置共享文件,/mnt/hgfs下却不显示共享文件的解决方法
一、共享文件夹设置步骤 打开虚拟机设置:右键点击虚拟机 → 选择 “设置” → 切换到 “选项” 标签页 → 点击 “共享文件夹”启用共享功能:选择 “总是启用”(确保虚拟机已关闭或处于运行状态)添加共享文件夹: 点击…...

go语言的锁
本篇文章主要讲锁,主要会涉及go的sync.Mutex和sync.RWMutex。 一.锁的概念和发展 1.1 锁的概念 所谓的加锁和解锁其实就是指一个数据是否被占用了,通过Mutex内的一个状态来表示。 例如,取 0 表示未加锁,1 表示已加锁ÿ…...