awk基本使用方式详解

awk基本用法、awk应用案例及综合脚本 如果要输出到屏幕可以使用命令awk '{a[$1]++}END{print a["abc"]}' shu.txt。按照awk逐行处理的工作特点使用awk '{a[$1]++}' shu.txt 走完每一行得到下列结果。准备一个文档,里面有6行,每行分别是abc、xyz、abc、opq、xyz、abc 然后。用法格式:BEGIN{ 任务1 }{ 任务2 }END{ 任务3 }BEGIN任务 执行1次,读取文档之前执行。END任务 执行1次,读取文档之后执行。 阅读详情

在这里插入图片描述

使用linux系统的人或许都听说过linux三剑客,它们分别是awk、sed和grep,在一切皆文件的linux系统中,这三种文本处理工具的使用显得非常重要。今天就主要介绍三剑客之一的awk,使用awk的优势很多,很方便快速,功能非常之强大,其也是Linux及Unix环境中现有的功能最强大的数据处理引擎之一。


为什么使用awk

awk作为linux中强大的文本处理工具,实际上也是一门编程语言了。因为有awk的存在,一些较为复杂的数据清洗及数据筛选的工作可以以很短的命令轻易地被解决而不需要每次都写一个脚本,正因为其在命令行运行的特点也使其能够通过管道与Shell脚本很好的交互,这是其他编程语言所不能及的(也正是因此听说在很多运维的面试中关于awk的问题的出现几率非常高)。

另外一个特点是awk读取文件时默认按一条条的记录进行读取的(默认就是一行一行地读取,但是awk是可以设定记录分隔符从而不仅仅是按行读取记录的),而在某些编程软件比如python中,若是使用pandas进行读取文件需要先将整个文件载入到内存,这样就十分地占据内存,同时在进行操作时也相对更费时间。但若是在awk中由于其按行操作,若是匹配到目标字符时就不再向后读取文件,相对更加节省内存,也更符合某些工作需求。

当然awk不是万能的,若是将非常复杂的文本处理工作交给awk可能就有点不划算了。

awk的使用方式

使用awk的命令一般为两种,即:

# 1. awk 'pattern {action}' filename
# 2. awk '{pattern + action}' filename

其中第一种使用方式最常用,也更与一般的问题解决方式契合(即先设定条件或“模式”,再对符合条件的目标执行“动作”),而第二种将“模式”和“动作”放在一起,可读性较差同时还可能导致代码混乱。任意的使用方式,只要能得到结果即可,在今天的文章中也只介绍第一种。接下来列出其中的一些要点:

  • pattern代表的是筛选要使用的模式,也可以理解成筛选条件,符合条件的才被执行后面的action中的命令。
    + pattern中能支持的筛选方式有正则表达式、比较计算、逻辑与(pattern && pattern)、逻辑或(pattern || pattern)、逻辑取反(!pattern)、改变优先级(如使用括号)等
  • 使用单引号将pattern和action两部分包围代表这是一个部分不可分割,awk识别这个部分中的模式和命令,并对要操作的文件进行相应的处理。这里最好只使用单引号,因为双引号有时候会出问题,文章后面会解释。
  • action即对符合pattern筛选的记录进行某些动作,可以是linux中的任何语句,但常用的命令有print、split、substr、sub、gsub等。
  • action中使用多个语句需要使用分号分割(与shell中相同)。
  • pattern和action在某些情况下可以省略。
  • 一个awk命令可以包含多次pattern{action},直接连用即可。
  • 若没有要读取的文件,那么需要通过管道命令将要处理的数据交给awk进行处理,如在服务器中对某些记录(如ifconfig)的处理。
  • awk中支持流程控制语句,如while、if、do/while、for、break、continue等等,可以将shell命令和其联动,因此其可以写出很复杂的语句,这种较复杂的语句一般放在脚本中被执行。

除了上面的要点外,awk也可以接一些参数,接下来介绍两种最常用的参数:

  • -f 有时候若是awk命令要执行的代码较多,写在命令行上会很混乱,这时将这些代码写在一个脚本中,使用-f参数表示要执行的pattern和action都来自-f后接的文件。
  • -F 此参数指定用于awk分隔字符的字符,awk默认的分隔字符为空格或者tab键,比如若是csv文件,那么你可以设定-F 为,。

接下来展示几个例子:

使用比较进行筛选

cat /etc/passwd |awk -F ':' '$1=="root" {print $7}'
# 使用上面的命令查看root用户默认使用的shell
# 运行结果如下图,可以直接拷贝到shell命令行中去试试哦,得到的结果应该是一样的。

在这里插入图片描述
可以看到root用户默认使用的shell是bash。分析一下上面的例子:

  • 首先使用cat命令查看passwd文件,并使用管道命令将结果传递给awk进行处理。
  • 由于passwd中的信息都是以冒号:分割的,和默认分隔符不同,因此需要制定要使用的分隔符为:
  • 刚刚提到了awk是逐个读取每条记录的,默认情况也就是逐行读取的,对于每一行中的内容都使用分隔符分隔,这样得到了一个类似列表的结构,使用$符号加上数字就表示要取出列表中的这个数字对应下标的字符串,注意$0代表的是整行。
  • 后面的单引号中的内容就是一个标准的pattern{action}模式,前面pattern中的$1=="root"表示需要筛选的是被分隔符分隔得到的列表中的第一个字符串为"root"的行,只有第一个字符串为"root"才会被筛选。
  • 这里解释一下刚刚提到的为什么不能使用双引号在pattern{action}外面,这是因为在linux中双引号包含的内容会被linux shell获取,从而导致$1这样的变量被shell误解为是shell自身的变量而不是awk中的变量,只有使用单引号才不会导致这样的问题。
  • 通过筛选的行被传给action,这里的action对行进行处理,在这里使用print打印出第七个部分,也就是root所使用的shell。执行结果与预期相同。

当然数值比较也是一样的,这里就不展示例子了。

使用正则表达式进行筛选

正则表达式这里就不多介绍了,其对于编程的重要性不言而喻,linux中的正则表达式也是很重要的,接下来使用正则表达式达到上面例子的效果:

cat /etc/passwd |awk -F ':' '/root/ {print $7}'
# 其实也非常的简单,将要匹配的正则表达式使用两个斜杠包裹起来就行了,这里匹配含有root字符的记录
# 结果也是/bin/bash

逻辑符号

cat /etc/passwd |awk -F ':' '/home/&&$7=="/bin/bash" {print $1}'
# 这里的&&表示前后的两个条件都要符合才行,即含有home目录且默认shell为bash的用户名(第一列)
# 运行结果是很多人名,就不展示出来了,读者可以自己拷贝过去试试

awk语句中的BEGIN和END

上面提到过awk中可以有多个pattern{action},只需要直接连用即可,这里的BEGIN和END就是pattern的一种特殊形式,BEGIN携带的action是在开始处理文本数据之前先要执行的,而END携带的action则是在处理文本数据结束后才执行的,因此中间的处理部分可以被称为main部分,main部分也可以有多项。不要小看这两条语句,实际应用中是十分有用处的。

先看一个简单的例子吧,比如想要看使用bash作为默认shell的用户为哪些,那么可以使用如下的命令:

cat /etc/passwd | awk -F ':' 'BEGIN {print "开始咯"} $7=="/bin/bash" {print $1} END {print "结束咯"}'
# 例子可以直接拷贝到shell命令行运行试试
# 运行结果

在这里插入图片描述
中间有很多用户名,考虑隐私问题不能展示。不过可以看到运行的结果中首先打印出开始,最后再以打印结束而结束,中间的条目是由$7=="/bin/bash" {print $1}所产生的,也就是说BEGIN和END部分都只执行一次,而内部的语句则一次读取一条记录直到整个文件信息读完,这个点需要注意!

接下来展示一个比较有用的例子,即对ifconfig内容的处理,ifconfig命令是用于显示或设置网络设备的命令,默认情况下使用ifconfig命令得到的结果为很长的几段,并且段与段间有一个空行,如下图所示:
在这里插入图片描述
若是想要取得其中ipv4的地址,也就是inet后的内容。接下来分析一下处理过程:

  • 联系到上面提到的记录分隔符,若是将一个段落作为一条记录的读取那么将会比较方便。
  • 那这时候我只需要将分隔符设置为两个换行符(\n\n)即可,如上图所示。
  • 设置分隔符最好在BEGIN中设置,因为在BEGIN中设置的选项会在一开始就被awk获取到,若是在main部分才设置,会先读取一条记录后才获取到设置的分隔符,这个读者感兴趣可以试试。
  • 经过计算后,发现地址在每个段落中的第六个位置(即$6)。

分析结束后写出的代码:

ifconfig |awk 'BEGIN {RS="\n\n"} {print $6}'
# 这里的RS是awk的一种内置变量,意思是记录分隔符。awk中的内置变量有十多个,可以直接使用
# 后面会列出awk中的内置变量

得到的结果如下图:
在这里插入图片描述
若是想要将结果都打印在一行中以tab符号分隔,可以再加一个内置变量即输出分隔符(OFS),默认的输出分隔符是换行符,所以我们看到的每条结果都是以换行符隔开的,使用OFS可以自定义分隔符:

ifconfig |awk 'BEGIN {RS="\n\n";ORS="\t"} {print $6} END {print "\n"}'
# 每个命令间以分号分隔即可
# 这里最后输出结束没有换行符,所以在END处多加了一个换行符

在这里插入图片描述

执行文件中的awk命令

若是执行较短的命令是没有必要将命令写到文件中的,但若是命令很长,逻辑也较为复杂,那么写在脚本中则会比较清晰明了且不易出错,这里我将上面的例子写到文件中做一个展示:

文件内容:
在这里插入图片描述

运行结果同上。

awk中的内置变量

图源:https://www.runoob.com/linux/linux-comm-awk.html
-
其中$、FS、NR、RS等较为常用,其它的变量在需要使用时可以再去深入理解。

叮

awk的功能很强大,它可以完成很多工作,写成脚本也可以写的很复杂,有兴趣的读者可以去看一下骏马金龙这位博主的18个awk的经典实战案例,其中的案例相对较复杂,将awk能完成的较经典的案例都讲了一遍,并且讲解十分清晰,值得一看。分别有博客和视频两版。

参考:https://www.bilibili.com/video/BV1BJ411X7QN?p=14
参考:https://www.runoob.com/linux/linux-comm-awk.html

AWK基础教程 前言 之前针对WorkerHub小程序做的数据分析文章 XXX 收到了一些小伙伴的回复,点名要学习数据分析,其实我也是一知半解,想着来写几篇文章简单聊下我分析的过程。 首先是数据清洗和统计了,这块我并没有用诸如Python之类的脚本语言,虽然Python提供了很多强大的数据分析库如Pandas、Numpy等,但是毕竟要麻烦一些,还要写个脚本,装一堆库(PS:其实就是懒)。 我用的是一个老的Unix工具 AWK,虽然历史比较久远,但是它简洁和丰富的功能可以称之为神器,同时也是后台同学必须要掌握的一个工具, 阅读详情

相关推荐

Linux 三剑客之 awk 实战详解教程

我们知道 Linux 三剑客,它们分别是:grep、sed、awk。在前边已经讲过 grep 和 sed,没看过的同学可以直接点击阅读,今天要分享的是更为强大的 awk。 sed 可以实现非交互式的字符串替换,grep 能够实现有效的过滤功能。与两者相比,awk 是一款强大的文本分析工具,在对数据分析并生成报告时,显得尤为强悍。 awk 强大的功能,是一般 Linux 命令无法比拟的。在本文中,我不会告诉你 awk 也是一种编程语言,免得会吓到你。我们只需把它当做 Linux 下一款强大的文本分析工具即可

696

awk的使用

linux里面的awk命令

xiaoliu的博客 3106

拆解汽车T-Box:从4G模块到MCU,手把手教你理解车联网的‘黑匣子’

本文深入拆解汽车T-Box,揭示其作为车联网‘黑匣子’的核心架构与工作原理。从4G模块、MCU主控到外设接口,详细解析各组件功能及协同机制,并通过实战案例展示故障诊断与性能优化技巧,帮助读者全面理解T-Box在智能汽车中的关键作用。

weixin_30955617的博客 493

AWK 使用详解

awk的工作原理 一次读取一行文本,按输入分隔符进行切片,切成多个组成部分,将每片直接保存在内建的变量中,$1,$2,$3....,引用指定的变量,可以显示指定断,或者多个断。如果需要显示全部的,需要使用$0来引用。可以对单个片断进行判断,也可以对所有断进行循环判断。其默认分隔符为空格 awk的基本用法格式 awk [options] 'program' FILE...... 语句之间用分号分隔 [options] -F : 指明输入时用到的字段分隔符 -v var=VALU

lantian000的博客 3892

P+F--r2000激光雷达slam技术实现

P+F--r2000激光雷达slam技术实现

majingming123的博客 1667

Codex接入CCSwitch:本地代理与模型路由配置指南

在AI编程工具链中,本地代理与模型路由是连接智能体与模型服务的核心桥梁。Codex作为OpenAI推出的编程智能体,虽然具备强大的仓库理解和自主编码能力,但其默认模型链路固定,导致在多模型切换、内网统一管理及成本控制上存在天然瓶颈。CCSwitch正是为解决这一痛点而生的本地代理工具,它通过OpenAI兼容协议将Codex的请求透明转发至DeepSeek、通义千问等第三方模型服务,使模型切换如同点击按钮般简单。本文从本地代理和模型路由器的基础原理切入,系统讲解Codex与CCSwitch的安装配置、模型ID

weixin_33910460的博客 427

awk 学习

录自《《LINUX与UNIX SHELL编程指南》读书笔记》(zqf620) AWK介绍 0.awk有3个不同版本: awk、nawk和gawk,未作特别说明,一般指gawk。 1.awk语言的最基本功能是在文件或字符串中基于指定规则来分解抽取信息,也可以基于指定的规则来输出数据。完整的awk脚本通常用来格式化文本文件中的信息。 2.三种方式调用awk 1) awk [

努力的瓜子 830

从业务角色到工作台:一步步创建 SAP Fiori Launchpad Space 与 Page

SAP S/4HANA Launchpad 配置优化指南:从业务角色出发构建高效工作台 本文针对S/4HANA项目中用户普遍反映的"入口难找"问题,提出基于Spaces和Pages的系统化解决方案。通过"以工作岗位为中心"的设计理念,将Launchpad信息架构重构为:一个业务角色对应一个Space,每个Space包含1-5个Page,Page内按任务划分2-5个Section,每个Section放置3-7个Tiles。文章详细阐述了从Business Role入手配

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 224

AWK详解

awk详解与使用

wq1205750492的博客 1万+

基于STM32L4XX、HAL库的SIM65M定位模块驱动程序设计

SIM65M是一款基于4G LTE Cat.1的无线通信模块,支持最大下行速率10Mbps和上行速率5Mbps。它兼容多种网络协议(TCP/UDP/HTTP/HTTPS/FTP/MQTT等),适用于物联网应用。PC0 <---> PWRKEY (模块电源控制)PC1 <---> RESET (模块复位)支持LTE-FDD/LTE-TDD。工作电压:3.4V~4.2V。

zhusl6688的博客 196

使用机器学习算法预测黄金价格

在本文中,我们将使用线性回归、XGBoost和LSTM这三种不同的机器学习算法来预测黄金价格。接下来,我们使用线性回归、XGBoost和LSTM分别建立了模型,并进行了训练和预测。这些机器学习算法可以帮助我们对黄金价格进行预测,但请注意,市场价格受多种因素影响,因此预测结果可能并不完全准确。接下来,我们需要对数据进行一些预处理,以便用于机器学习模型的训练和测试。我们将使用80%的数据作为训练集,20%的数据作为测试集。最后,我们将绘制每个模型的预测结果,并将其与实际价格进行比较,以评估模型的性能。

QromMatlab的博客 1316

awk的基本使用和调用方式

awk的基本使用和调用方式 1.awk的基本使用 与sed相比,awk不仅能以行为单位处理文件,还可以以列为单位处理文件。awk缺省的行分隔符是换行,缺省的列换行符是连续的空行和Tab,但是行分隔符和列分隔符都可以自定义,比如/ect/passwd文件的每一行有若干个字段,字段之间以:分隔,就可以重新定义awk的列分隔符为:并以列为单位处理这个文件。awk实际上是一门很复杂的脚本语言,还有像C

step_ma的博客 857

Python 爬虫实战:爬取 GitHub 热门项目(星数 / 语言 / 作者)

本文系统介绍了使用Python爬虫技术获取GitHub热门项目数据的完整方案。通过分析GitHub Trending页面和官方API两种数据源,详细讲解了HTML解析、JSON数据处理、反爬应对策略等关键技术。采用requests、BeautifulSoup、pandas等工具链,实现了项目信息(名称、星数、语言等)的结构化爬取,并配套数据清洗、统计分析及可视化功能。特别强调遵守GitHub API使用规范,包括Token认证、请求频率控制等合规要求。该方案为开发者提供了一种高效、合法的数据采集方法,适用于

2503_91057718的博客 2342

awk的基本使用方法

awk是处理文本文件的一个应用程序,几乎所有 Linux 系统都自带这个程序。 它依次处理文件的每一行,并读取里面的每一个字段。对于日志、CSV 那样的每行格式相同的文本文件,awk可能是最方便的工具。 awk其实不仅仅是工具软件,还是一种编程语言。不过,本文只介绍它的命令行用法,对于大多数场合,应该足够用了。   一、基本用法 awk的基本用法就是下...

老率的IT私房菜 5645

ANSYS WORKBENCH——参数化建模以及参数优化(结果导出为Excel)

目录 1、打开软件workbench 2、找到static structure,双击打开 3、选择材料 4、参数化建模 ​ 注:印记面的创建 5、模型属性设置 注:设置优化目标 6、回主界面,选择direct optimization模块 1、打开软件workbench 2、找到static structure,双击打开 3、选择材料 4、参数化建模 至此参数化建模就已经完成啦 注:印记面的创建 印记面一般是一个虚拟的区域,参与实际的网格划分,但是只是由于载.

python_AI_fans的博客 1万+

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

shell awk使用详解

目录 awk基本格式 常用命令选项 awk执行过程分析 AWK内置变量  重定向到另一个文件 语法 自定义变量 awk内部自定义 将外部变量值传递给awk 运算符 循环结构 for while do while break continue next exit 数组 创建数组 数组长度 输出数组内容 判断键值是否存在 删除键值 正则 if中使用 ...

今天吃了吗的博客 4208

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

【linux】awk的基本使用

awk是shell中一个强大的文本处理工具,被用于处理文本和数据当你心中默念想要使用类似于处理某一行,处理某一列 的文本的功能时,就是awk登场的时候了举个简单的例子是,当我们想知道自己的所有网卡的名字时,可以用ifconfig查看我们会看到类似于上述信息一样密密麻麻的文字,当然我们可以手动CTRL C CTRL V 把网卡名称拿出来,但是如果希望有一种写法可以不用手动去查看获取的话,可以试试使用awk。

andyshi1998的博客 2498

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

awk基本用法及案例详解

0 引言 awk是一个强大的文本分析工具,把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行分析处理。 awk工作原理: #awk -F : '{print $1,$3}' /etc/passwd (1) awk使用一行作为输入,并将这一行赋给内部变量$0,每一行也可称为一个记录,以换行符结束 (2)然后行被:(默认是空格或制表符)分解成字段(或域),...

石榴姐yyds 1499

awk的基本使用

1.awk简介awk:文本处理工具awk有3个不同版本: awk、nawk和gawk,未作特别说明,一般指gawk,gawk 是 AWK 的 GNU 版本。2.awk语法 awk ‘{pattern + action}’ {filenames} 其中 pattern 表示 AWK 在数据中查找的内容,而 action 是在找到匹配内容时所执行的一系列命令。 3.使用方式1. 命令行方式awk [-F

Pencil的博客 507

【shell】awk基本用法

awk基本用法及举例

sodaloveer的博客 3211

awk详解

Linux awk 命令详解

JintGuo的博客 1774

shell编程之awk命令详解

我们可以在输出内容中添加注释、自定义分隔符等。例如,对于grades.txt。

2301_81704123的博客 1575

Linux awk命令基本使用方法

Linux awk命令基本使用方法 awk命令是一种处理文本的语言,是一个强大的文本分析工具,比较适用于文本的格式化。 awk命令结构: awk 'BEGIN{commands} pattern{command} END{command}' awk工作流程可以分为三个部分: 读取输入文件之前执行的代码段(由BEGIN关键字标识) 主循环执行输入文件的代码段 读取输入文件之后的代码段(由END关键字 标识) 基本用法: 用法一: awk '{[pattern] action}' {filename}

qq_41571224的博客 8086

awk使用方法详解

awk工具 awk 选项 ‘模式或条件{编辑命令}’ 文件1 文件2…. //过滤并输出文件中符合条件的内容 awk -f 脚本文件 文件1 文件2… //从脚本中调用的编辑指令,过滤并输出内容 awk包含几个特殊的内建变量(可直接用)如下所示: FS:指定每行文本的字段分隔符,默认为空格或制表位; NF:当前处理的行的字段个数; NR:当前处理的行的行号(序数); $0:当前处理的行的整行内容; $n:当前处理的行的第n个字段(第n列); FILENAME:被处理的文件名; RS:数据记录分隔,默认为\n

empty_csx的博客 3521
上一篇: 二代测序技术之illumina测序技术原理简介
下一篇: python3 字符串格式化(%和format)
你大佬来啦
博客等级 码龄7年 322粉丝 62原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值