Linux文本处理三剑客:awk

在Linux操作系统中,grep、sed、awk被称为文本操作“三剑客”,上两期中,我们将详细介绍grep、sed的基本使用方法,希望能够帮助到有需要的朋友,现在,我们继续学习awk。

虽然awk是一个Linux中常见的命令,但确切的说,awk是一门编程语言。

要讲起来真的十分复杂,网上有很多教程,讲的都很棒的,但是也讲得很迷糊。

我也是在摸索中学习,尽量讲清晰一些,希望您在看的过程中,能够有所发现。

首先上官方手册:Gawk - GNU Project - Free Software Foundation (FSF)

1、awk简介

gawk - pattern scanning and processing language(模式扫描和处理语言)。AWK 的名称是由它们设计者的名字缩写而来 ——Afred Aho, Peter Weinberger与Brian Kernighan。

1.1 语法

awk [options] file ...

gawk [ POSIX or GNU style options ] -f program-file [ -- ] file ...
gawk [ POSIX or GNU style options ] [ -- ] program-text file ...

pgawk [ POSIX or GNU style options ] -f program-file [ -- ] file ...
pgawk [ POSIX or GNU style options ] [ -- ] program-text file ...

dgawk [ POSIX or GNU style options ] -f program-file [ -- ] file ...

可以看到,awk有几种版本,包括GAWK、pgawk、dgawk 。GAWK完全兼容 AWK 与 NAWK

1.2 描述

gawk 是 GNU 项目对 AWK 编程语言的实现。它符合 POSIX 1003.1 标准中对该语言的定义。该版本又基于 Aho、Kernighan 和 Weinberger 合著的《AWK 编程语言》一书中的描述。gawk 提供了当前版本 UNIX awk 中的一些附加功能以及许多 GNU 特有的扩展。命令行由 gawk 自身的选项、AWK 程序文本(如果没有通过 -f 或 --file 选项提供)以及要在预定义 AWK 变量 ARGC 和 ARGV 中使用的值组成。

pgawk 是 gawk 的性能分析版本。除了程序运行速度较慢并且在完成后自动在 awkprof.out 文件中生成执行性能分析报告之外,它在其他方面都与 gawk 完全相同。请参阅下面 --profile 选项的说明。

dgawk 是一个 awk 调试器。它不会直接运行程序,而是加载 AWK 源代码,然后提示输入调试命令。与 gawk 和 pgawk 不同,dgawk 只处理使用 -f 选项提供的 AWK 程序源代码。调试器在《GAWK: 高效 AWK 编程》一书中有详细介绍。

1.3 工作流程

awk语言的工作流程如上所示,分为三块为:BEGIN块、BODY块和END块。

BEGIN块开始,循环执行BODY块,最后执行END块。

开始块(BEGIN block)

开始块的语法格式如下所示:

BEGIN {awk-commands}

程序启动执行BEGIN块代码部分,BEGIN块在整个过程中只执行一次。BEGIN 是 AWK 的关键字,因此它必须是大写的。BEGIN块是可选的,可以没有BEGIN块部分。注意,awk代码块使用 {} 花括号整合一个块。

主体块(Body Block)

主体部分的语法要求如下:

/pattern/ {awk-commands}
对于每一个输入的行都会执行一次主体部分的命令。默认情况下,对于输入的每一行,AWK 都会很执行命令。但是,我们可以将其限定在指定的模式中。 注意,在主体块部分没有关键字存在。

结束块(END Block)

下面是结束块的语法格式:

END {awk-commands}
结束块是在程序结束时执行的代码。 END 也是 AWK 的关键字,它也必须大写。 与开始块相似,结束块也是可选的。

1.4 一个简单的例子

先创建一个名为 file1.txt 的文件。

Jan	13	25	15	115
Feb	15	32	24	226
Mar	15	24	34	228
Apr	31	52	63	420
May	16	34	29	208
Jun	31	42	75	492
Jul	24	34	67	436
Aug	15	34	47	316
Sep	13	55	37	277
Oct	29	54	68	525
Nov	20	87	82	577
Dec	17	35	61	401

使用下面的awk代码,

$ awk 'BEGIN{printf "月份\t年\t日\t年份\t版本\n"} {print}' file1.txt

执行以上命令,输出结果如下:

月份    年      日      年份    版本
Jan	13	25	15	115
Feb	15	32	24	226
Mar	15	24	34	228
Apr	31	52	63	420
May	16	34	29	208
Jun	31	42	75	492
Jul	24	34	67	436
Aug	15	34	47	316
Sep	13	55	37	277
Oct	29	54	68	525
Nov	20	87	82	577
Dec	17	35	61	401

对于这句代码,awk'BEGIN{printf "月份\t年\t日\t年份\t版本\n"} {print}' file1.txt,我们简单解释一下:

程序开始执行时,AWK 在开始块中读到了“BEGIN” 这个关键词,执行花括号里面的内容,输出表头信息。在主体块中,AWK 每读入一行就将读入的内容输出至标准输出流中,一直循环到整个文件被全部读入为止。

awk

程序指令

' ‘

awk程序块

BEGIN

开始块

{...}

awk开始块的程序

printf

指定格式输出

" "

printf的输出内容

\t

制表符

\n

换行符

{print}

主体块,简单输出

这里还涉及到两个知识点,printf和print

这里大概讲一下,前面的 printf 是为了控制宽度、精度采用,而后面的 print 只需要简单的输出数据而已。

2、awk常用参数

常用参数:
-c:使用兼容模式
-C:显示版权信息
-e:指定源码文件
-f:从脚本中读取 awk 命令
-F:设置输入时的字段分隔符
-v:自定义变量信息
-h:显示帮助信息
-m:对指定值进行限制

3、awk的变量

ARGC 
表示在命令行提供的参数的个数。
ARGV 
这个变量表示存储命令行输入参数的数组。数组的有效索引是从 0 到 ARGC-1。
CONVFMT
此变量表示数据转换为字符串的格式,其默认值为 %.6g。
ENVIRON
此变量是与环境变量相关的关联数组变量。
FILENAME
此变量表示当前文件名称。
FS
此变量表示输入的数据域之间的分隔符,其默认值是空格。 你可以使用 -F 命令行选项改变它的默认值。
NF
此变量表示当前输入记录中域的数量。
NR
此变量表示当前记录的数量。(译注:该变量类似一个计数器,统计记录的数量)
FNR
该变量与 NR 类似,不过它是相对于当前文件而言的。此变量在处理多个文件输入时有重要的作用。每当从新的文件中读入时 FNR 都会被重新设置为 0。
OFMT
此变量表示数值输出的格式,它的默认值为 %.6g。

示例:

还是原来file1.txt这张表:

Jan	13	25	15	115
Feb	15	32	24	226
Mar	15	24	34	228
Apr	31	52	63	420
May	16	34	29	208
Jun	31	42	75	492
Jul	24	34	67	436
Aug	15	34	47	316
Sep	13	55	37	277
Oct	29	54	68	525
Nov	20	87	82	577
Dec	17	35	61	401

对于awk而言,变量就是列,用$符号来表示,比如下面的内容:

$ awk '{print $1}' file1.txt

这里 $1,表示输出第一列,输入如下:

Jan
Feb
Mar
Apr
May
Jun
Jul
Aug
Sep
Oct
Nov
Dec

要是使用下面的代码:

$ awk -F: '{print $1}' file1.txt

输出:

Jan	13	25	15	115
Feb	15	32	24	226
Mar	15	24	34	228
Apr	31	52	63	420
May	16	34	29	208
Jun	31	42	75	492
Jul	24	34	67	436
Aug	15	34	47	316
Sep	13	55	37	277
Oct	29	54	68	525
Nov	20	87	82	577
Dec	17	35	61	401
这里,-F:设置输入时的字段分隔符。

要是使用下面的代码:

$ awk -F: '{print $1,$NF}' file1.txt
输出:
Jan     13      25      15      115 Jan 13      25      15      115
Feb     15      32      24      226 Feb 15      32      24      226
Mar     15      24      34      228 Mar 15      24      34      228
Apr     31      52      63      420 Apr 31      52      63      420
May     16      34      29      208 May 16      34      29      208
Jun     31      42      75      492 Jun 31      42      75      492
Jul     24      34      67      436 Jul 24      34      67      436
Aug     15      34      47      316 Aug 15      34      47      316
Sep     13      55      37      277 Sep 13      55      37      277
Oct     29      54      68      525 Oct 29      54      68      525
Nov     20      87      82      577 Nov 20      87      82      577
Dec     17      35      61      401 Dec 17      35      61      401
 

这里,NF 此变量表示当前输入记录中域的数量。

还有很多内容,包括循环、条件、运算、函数等,篇幅有限,看后期大家是否需要,如果需要的话,关注我,联系我更新。

如果您觉得有些用处,欢迎在评论区留言,关注。谢谢您的阅读!

  往期学习笔记:

Windows系统开启Linux子系统(Ubuntu)

Linux常用命令(目录操作命令)

Linux常用命令:文件的创建、复制、移动、查找和删除命令

Linux常用命令:文本文件的查看与编辑

Linux常用命令:文本文件的拼接与分割

Linux常用命令:文件的权限管理

Linux常用命令:文件的下载、压缩与解压

Linux常用命令:常见的操作符

Linux常用命令:系统操作命令
 

 Linux文本处理三剑客:grep

Linux文本处理三剑客:sed

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C 嵌入式系统设计模式 17:静态优先级模式

本书的原著为:《Design Patterns for Embedded Systems in C ——An Embedded Software Engineering Toolkit 》,讲解的是嵌入式系统设计模式,是一本不可多得的好书。 本系列描述我对书中内容的理解。本文章描述嵌入式并发和资源管理模式之三…

Slicer学习笔记(六十五) 3DSlicer的医学图像数据增强扩展模块

1. 医学图像数据增强扩展模块 基于3D Slicer5.1.0 编写了一个测试医学图像的数据增强测试扩展模块。 扩展模块名:DataAugementation 项目地址:DataAugmentation 下载该项目后,可以将该扩展模块添加到3D Slicer的扩展中。 关于如何给3DSlicer…

【STA】多场景时序检查学习记录

单周期路径 建立时间时序检查 在时钟的有效沿到达触发器之前,数据应在一定时间内保持稳定,这段时间即触发器的建立 时间。满足建立时间要求将确保数据可靠地被捕获到触发器中。 建立时间检查是从发起触发器中时钟的第一个有效沿到捕获触发器中时钟后面…

萌新学习RSA第一天

文章来自NSSCTF工坊Xenny的课程 1.非对称加密 2.介绍RSA来源(三位数学家名字开头) 3.RSA数学基础 4.算法实现 from Crypto.Util.number import * #这个是关于RSA很多函数的库 p getPrime(512) #111RSA第一步:生成随机的51…

Sora学习(一):Sora技术路径整体认知

前文:最近跟着DataWhale组队学习这一期“Sora原理与技术实战”,本篇博客主要是基于DataWhale成员、厦门大学平潭研究院杨知铮研究员分享的Sora技术原理详解课件内容以及参考网上一些博客资料整理而来(详见文末参考文献)&#xff0…

鸿蒙Harmony应用开发—ArkTS声明式开发(通用属性:禁用控制)

组件是否可交互,可交互状态下响应点击事件、触摸事件、拖拽事件、按键事件、焦点事件和鼠标事件。 说明: 从API Version 7开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 enabled enabled(value: boolean) 设置组…

持续集成(CICD)- Git版本管理工具,Gitee线上仓库

文章目录 一、学习目标:二、什么是Git工具三 、Git环境搭建(windows系统)四、Gitee设置(私钥和公钥绑定)五、Git结合Gittee进行基本设置(重要)六、在Gitee上新建仓库私有仓库(非空仓库)七、Git拉取线上仓库代码,提交代码(重要)八、Git解决版本冲突问题(重要)场景一…

第二讲:用geth和以太坊交互

一:安装geth brew install ethereum geth github网址: https://github.com/ethereum/go-ethereum 二: 用geth连接以太坊 以太坊有主网络(Ethereum Mainnet),有测试网络(Sepolia、Goerli 等等…

leetcode 热题 100_盛最多水的容器

题解一: 双指针遍历:容量计算公式为min(左高度,右高度)*底部距离,我们可以令底部距离逐步递减(左右两边的指针向中部移动)。此时对于min(左高度,右高度),假设较高的线向中部移动&…

如何修炼成“神医”——《OceanBase诊断系列》之一

本系列是基于OcenaBase 开发工程师在工作中的一些诊断经验,也欢迎大家分享相关经验。 1. 关于神医的故事 扁鹊,中国古代第一个被正史记载的医生,他的成才之路非常传奇。年轻时,扁鹊是一家客栈的主管。有一位名叫长桑君的客人来到…

HTTPS的实现原理

图片来源:HTTPS 详解一:附带最精美详尽的 HTTPS 原理图 - 个人文章 - SegmentFault 思否 加密流程按图中的序号分为: 客户端请求 HTTPS 网址,然后连接到 server 的 443 端口 (HTTPS 默认端口,类似于 HTTP 的80端口)。…

小程序和页面生命周期详解

目录 小程序的生命周期 创建(onLoad): 显示(onShow): 隐藏(onHide): 卸载(onUnload): 错误监听(onError)…

使用最新Hal库实现USART中断收发功能(STM32F4xx)

目录 概述 1 认识STM32F4XX的USART 1.1 USART 功能说明 1.2 USART的中断 1.3 USART 模式配置 1.4 USART的寄存器 2 使用STM32CubeMX 生成工程 2.1 配置参数 2.2 生成工程代码 3 实现软件功能 3.1 软件功能介绍 3.2 认识USART Hal库 3.2.1 初始化函数组 3.2.2 发送…

66-ES6:var,let,const,函数的声明方式,函数参数,剩余函数,延展操作符,严格模式

1.JavaScript语言的执行流程 编译阶段:构建执行函数;执行阶段:代码依次执行 2.代码块:{ } 3.变量声明方式var 有声明提升,允许重复声明,声明函数级作用域 访问:声明后访问都是正常的&…

殿堂级Flink源码极精课程预售

一、为什么我们要读源码? 1、让个人技术快速成长: 优秀的开源框架,底层的源码设计思想也非常优秀,同时还有含有大量的设计模式和并发编程技术,优秀的解决方案,熟读源码对猿们技术提升有很大帮助 2、新技术学习能力: Java开源码框架的源码熟读后,若出现…

挑战杯 基于机器视觉的车道线检测

文章目录 1 前言2 先上成果3 车道线4 问题抽象(建立模型)5 帧掩码(Frame Mask)6 车道检测的图像预处理7 图像阈值化8 霍夫线变换9 实现车道检测9.1 帧掩码创建9.2 图像预处理9.2.1 图像阈值化9.2.2 霍夫线变换 最后 1 前言 🔥 优质竞赛项目系列,今天要分…

Doris实战——银联商务实时数仓构建

目录 前言 一、应用场景 二、OLAP选型 三、实时数仓构建 四、实时数仓体系的建设与实践 4.1 数仓分层的合理规划 4.2 分桶分区策略的合理设置 4.3 多源数据迁移方案 4.4 全量与增量数据的同步 4.5 离线数据加工任务迁移 五、金融级数仓稳定性最佳实践 5.1 多租户资…

返回数据(返回视图所需要的数据)

在上篇文章中,小编带领大家了解到:返回静态数据-CSDN博客,但是,仅仅返回一个静态页面,对于静态页面的数据没正常返回! 所以,本篇文章便讲述如何返回数据?? 还是先不管前…

AI大语言模型【成像光谱遥感技术】ChatGPT应用指南

遥感技术主要通过卫星和飞机从远处观察和测量我们的环境,是理解和监测地球物理、化学和生物系统的基石。ChatGPT是由OpenAI开发的最先进的语言模型,在理解和生成人类语言方面表现出了非凡的能力。本文重点介绍ChatGPT在遥感中的应用,人工智能…

Revit-二开之创建墙-(6)

Revit API窗间墙 protected override Result OnExecute(ExternalCommandData commandData, ref string message, ElementSet elements) {try{// 获取当前活动的文档