Linux工作台文件操作命令全流程解析(高级篇之awk精讲)

news2025/5/14 18:21:15

全文目录

    • 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 hash
    close(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 "总请求:", total
    print "状态码分布:"
    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; do
    free -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,希望可以帮助到读者。 如有任何问题,欢迎评论区指正与点评,同时,觉得对你有帮助,也欢迎点赞与收藏。我们共同努力,一起进步!


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2375568.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

力扣119题:杨辉三角II(滚动数组)

小学生一枚&#xff0c;自学信奥中&#xff0c;没参加培训机构&#xff0c;所以命名不规范、代码不优美是在所难免的&#xff0c;欢迎指正。 标签&#xff1a; 杨辉三角、滚动数组 语言&#xff1a; C 题目&#xff1a; 给定一个非负索引 rowIndex&#xff0c;返回「杨辉三角…

大疆无人机(全系列,包括mini)拉流至电脑,实现直播

参考视频 【保姆级教程】大疆无人机rtmp推流直播教程_哔哩哔哩_bilibili VLC使用教程&#xff1a; VLC工具使用指南-CSDN博客 目录 实现效果&#xff1a; 电脑端 ​编辑 ​编辑 无人机端 VLC拉流 分析 实现效果&#xff1a; (实验机型&#xff1a;大疆mini4kRC-N2遥控器、大…

uniapp-商城-54-后台 新增商品(页面布局)

后台页面中还存在商品信息的添加和修改等。接下来我们逐步进行分析和展开。包含页面布局和数据库逻辑等等。 1、整体效果 样式效果如下&#xff0c;依然采用了表单形式来完成和商家信息差不多&#xff0c;但在商品属性上多做了一些弹窗等界面&#xff0c;样式和功能点表多。 …

WebpackVite总结篇与进阶

模块化 Webpack Webpack 入口entry 分离app和第三方库入口 这是什么&#xff1f; 这是告诉 webpack 我们想要配置 2 个单独的入口点&#xff08;例如上面的示例&#xff09;。 为什么&#xff1f; 这样你就可以在 vendor.js 中存入未做修改的必要 library 或文件&#xff0…

【python】基础知识点100问

以下是Python基础语法知识的30条要点整理,涵盖数据类型、函数、控制结构等核心内容,结合最新资料归纳总结: 基础30问 一、函数特性 函数多返回值 支持用逗号分隔返回多个值,自动打包为元组,接收时可解包到多个变量 def func(): return 1, "a" x, y = func()匿…

SpringBoot--springboot简述及快速入门

spring Boot是spring提供的一个子项目&#xff0c;用于快速构建spring应用程序 传统方式&#xff1a; 在众多子项目中&#xff0c;spring framework项目为核心子项目&#xff0c;提供了核心的功能&#xff0c;其他的子项目都需要依赖于spring framework&#xff0c;在我们实际…

vscode_python远程调试_pathMappings配置说明

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

遨游5G-A防爆手机:赋能工业通信更快、更安全

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

Profibus DP主站与Modbus RTU/TCP网关与海仕达变频器轻松实现数据交互

Profibus DP主站与Modbus RTU/TCP网关与海仕达变频器轻松实现数据交互 Profibus DP主站转Modbus RTU/TCP&#xff08;XD-MDPBm20&#xff09;网关在Profibus总线侧实现主站功能&#xff0c;在Modbus串口侧实现从站功能。可将ProfibusDP协议的设备&#xff08;如&#xff1a;海…

「华为」人形机器人赛道投资首秀!

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

格雷希尔G10和G15系列自动化快速密封连接器,适用于哪些管件的密封,以及它们相关的特性有哪些?

格雷希尔G10和G15系列快速密封连接器&#xff0c;用于自动化和半自动化过程中的外部或内部密封&#xff0c;通过使用气压驱动来挤压内部的密封圈&#xff0c;创造一个适用于各种管件的无泄漏密封连接&#xff0c;连接器内部的弹性密封圈可以提供其他产品不能提供的卓越密封性能…

专栏特辑丨悬镜浅谈开源风险治理之SBOM与SCA

随着容器、微服务等新技术日新月异&#xff0c;开源软件成为业界主流形态&#xff0c;软件行业快速发展。但同时&#xff0c;软件供应链也越来越趋于复杂化和多样化&#xff0c;软件供应链安全风险不断加剧。 软件供应链安全主要包括软件开发生命周期和软件生存运营周期&#x…

vue3项目创建-配置-elementPlus导入-路由自动导入

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

MUSE Pi Pro 编译kernel内核及创建自动化脚本进行环境配置

视频讲解&#xff1a; MUSE Pi Pro 编译kernel内核及创建自动化脚本进行环境配置 今天分享的主题为创建自动化脚本编译MUSE Pi Pro的kernel内核&#xff0c;脚本已经上传到中 GitHub - LitchiCheng/MUSE-Pi-Pro-Learning: MUSE-Pi-Pro-Learning &#xff0c;有需要可以自行clon…

Innovus 25.1 版本更新:助力数字后端物理设计新飞跃

在数字后端物理设计领域&#xff0c;每一次工具的更新迭代都可能为项目带来巨大的效率提升与品质优化。今天&#xff0c;就让我们一同聚焦 Innovus 25.1 版本&#xff08;即 25.10 版本&#xff09;的更新要点&#xff0c;探寻其中蕴藏的创新能量。 一、核心功能的强势进 AI…

CodeBuddy 中国版 Cursor 实战:Redis+MySQL双引擎驱动〈王者荣耀〉战区排行榜

文章目录 一、引言二、系统架构设计2.1、整体架构概览2.2、数据库设计2.3、后端服务设计 三、实战&#xff1a;从零构建排行榜3.1、开发环境准备3.2、用户与战区 数据管理3.2.1、MySQL 数据库表创建3.2.2、实现用户和战区数据的 CURD 操作 3.3、实时分数更新3.4、排行榜查询3.5…

在线SQL转ER图工具

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

python高级特性

json.dumps({a:1,n:2}) #Python 字典类型转换为 JSON 对象。相当于jsonify data2 json.loads(json_str)#将 JSON 对象转换为 Python 字典 异步编程&#xff1a;在异步编程中&#xff0c;程序可以启动一个长时间运行的任务&#xff0c;然后继续执行其他任务&#xff0c;而无需等…

汇编:子程序设计

一、 实验要求 实验目的&#xff1a; 熟练掌握算术运算汇编指令的使用熟练掌握子程序设计的基本方法熟练掌握程序的调试方法 实验内容&#xff1a; 编程实现两个数&#xff1a;#8888H和#79H的乘除运算结合实验1的代码&#xff0c;将加减乘除四则运算写成四个子程序&#xff…

从概念表达到安全验证:智能驾驶功能迎来系统性规范

随着辅助驾驶事故频发&#xff0c;监管机制正在迅速补位。面对能力表达、使用责任、功能部署等方面的新要求&#xff0c;行业开始重估技术边界与验证能力&#xff0c;数字样机正成为企业合规落地的重要抓手。 2025年以来&#xff0c;围绕智能驾驶功能的争议不断升级。多起因辅…