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

awk 基础用法示例

awk 是 Linux 文本三剑客之一,擅长按列处理文本、提取信息和统计分析。下面通过具体示例解释其基本用法:

准备工作:创建测试文件

  • 首先创建 employee.txt 文件,包含员工编号、姓名、部门和年龄信息:

[lyk@controller ~ 11:22:03]$ cat << 'EOF' > employee.txt > 1)  张三  技术部  23> 2)  李四  人力部  22> 3)  王五  行政部  23> 4)  赵六  技术部  24> 5)  朱七  客服部  23> EOF

示例 1:打印所有内容(默认行为)

[lyk@controller ~ 11:22:12]$ awk '{ print }' employee.txt 1)  张三  技术部  232)  李四  人力部  223)  王五  行政部  234)  赵六  技术部  245)  朱七  客服部  23​
  • 解释

    awk '{ print }' 文件名

    是 awk 最基础的用法。

    • { print } 是 awk 的动作,表示 “打印当前行”(默认打印整行,即 $0$0 代表整行内容)。

    • 整个命令的作用:读取 employee.txt 的每一行,然后打印该行,等价于 cat 文件名

示例 2:通过脚本文件执行 awk 命令

  • 如果命令较复杂,可以把 awk 命令写到一个脚本文件中,用 -f 选项调用:

# 创建 awk 脚本文件(内容是要执行的 awk 命令)[lyk@controller ~ 11:23:53]$ vim commands.awk[lyk@controller ~ 11:25:38]$ cat commands.awk { print }                   # 脚本中只包含一条命令:打印每行​# 用 -f 选项执行脚本[lyk@controller ~ 11:25:43]$ awk -f commands.awk employee.txt 1)  张三  技术部  232)  李四  人力部  223)  王五  行政部  234)  赵六  技术部  245)  朱七  客服部  23​
  • -f 脚本名 表示 “从脚本文件中读取 awk 命令”,适合命令较多或需要复用的场景

示例 3:按内容匹配打印特定行

# 打印包含“张三”的行[lyk@controller ~ 11:25:58]$ awk '/张三/ { print }' employee.txt 1)  张三  技术部  23​#效果一样[lyk@controller ~ 11:26:18]$ awk '/张三/' employee.txt 1)  张三  技术部  23​

解释/张三/ 是 awk 的 “模式”,表示 “匹配包含‘张三’的行”。

  • 当模式匹配成功时,执行后面的动作({ print }),即打印该行。

  • 若省略动作,awk 会默认执行 { print },因此两种写法效果相同

示例 4:统计满足条件的行数

AWK 中的所有变量都不需要初始化,并且会自动初始化为 0

[lyk@controller ~ 11:26:24]$ awk '> /术/ { count=count+1 } > END { print "Count="count }' employee.txt#输出结果Count=2​

解释

  1. /术/:匹配包含 “术” 的行(这里匹配 “技术部” 的两行)

  2. { count=count+1 }:每匹配一行,变量 count 就加 1(awk 变量默认初始化为 0,无需提前定义)

  3. END { ... }END 是特殊模式,表示 “所有行处理完毕后执行后面的动作”,这里用于打印最终统计结果

  • 结果为 2,因为文件中 “技术部” 出现了 2 次(张三和赵六)

示例 5:按行长度筛选内容

AWK 提供了一个内建的函数 length($arg) 用于返回字符串 $arg 的总长度。

如果要获取某行的总长度,可以使用下面的语法:length($0)

同样的,如果要获取某列/字段的总长度,可以使用语法: length($n)

如果要判断某行的字符是否大于/小于/等于 N ,可以使用下面的语法:length($0) > N

[lyk@controller ~ 11:27:16]$ awk 'length($0)>10 { print $0 }' employee.txt​#因为所有的行的总长度都大于 18,因此输出结果如下:1)  张三  技术部  232)  李四  人力部  223)  王五  行政部  234)  赵六  技术部  245)  朱七  客服部  23

$0,代表整行记录

  • 解释

    • length($0) 是 awk 的内置函数,返回整行($0)的字符长度

    • length($0)>10:筛选出长度大于 10 的行(示例中所有行长度都超过 10,因此全部打印)

    • 若要筛选某一列的长度,可替换为 length($n)n 为列号,如 length($2) 表示第 2 列的长度)

核心概念总结

  1. 模式与动作:awk 基本语法是 模式 { 动作 },模式匹配行后执行动作(可省略动作,默认打印)。

  2. 变量:无需声明,默认初始化为 0,可直接用于计数、累加等。

  3. 特殊模式END 表示所有行处理完后执行动作,用于汇总结果。

  4. 内置函数:如 length() 计算长度,$0 代表整行,$n 代表第 n 列(默认按空格分隔列)。

http://www.dtcms.com/a/340274.html

相关文章:

  • 测试DuckDB插件对不同格式xlsx文件的读写效率
  • MyCAT分库分表
  • Go特有的安全漏洞及渗透测试利用方法(通俗易懂)
  • 次短路P2865 [USACO06NOV] Roadblocks G题解
  • SLAM文献之-Globally Consistent and Tightly Coupled 3D LiDAR Inertial Mapping
  • RESP协议
  • React响应式链路
  • SCAU学习笔记 - 自科三面前端方向实战演示
  • 157-基于Python的懂车帝汽车数据爬虫分析与可视化系统
  • NVIDIA Isaac Sim
  • Ubuntu 主机名:精通配置与管理
  • 全球首款 8K 全景无人机影翎 A1 发布解读:航拍进入“先飞行后取景”时代
  • 从 “模仿” 到 “创造”:AI 大模型的 “思维进化” 背后,技术突破在哪?
  • 沪深股指期货指数「IF000」期货行情怎么看?
  • 利用无事务方式插入数据库解决并发插入问题(最小主键id思路)
  • 海外短剧app、h5、独立站、国内短剧看广告app,短剧小程序、源码交付开发
  • java17学习笔记
  • RK android14 Setting一级菜单IR遥控器无法聚焦问题解决方法
  • VPS海外节点性能监控全攻略:从基础配置到高级优化
  • 02-docker相关知识
  • Java 学习笔记(基础篇6)
  • 29.Linux rsync+inotify解决同步数据实时性
  • 【Tech Arch】Apache HBase分布式 NoSQL 数据库
  • 签名应用APP分发平台的微服务化部署是什么?其有哪些优势?
  • 微服务自动注册到ShenYu网关配置详解
  • mysql数据恢复
  • WT2606B 驱屏语音芯片新增蓝牙功能:功能集成一体化,产品升级自动化,语音交互无线化,场景应用普适化!
  • Java 性能优化实战(二):JVM 调优的 5 个核心维度
  • 2.Shell脚本修炼手册之---创建第一个 Shell 脚本
  • Windows 11 安装 Miniconda + Mamba,配置国内源