文本编辑三剑客(awk)

news2024/9/20 14:23:58

awk作为和sed、grep同级的文本处理命令,也又强大的文本分析功能,同样,它的原理并不困难,但操作很多且很杂,可以通过不同的需求进行自定义搭配。

awk工作原理

awk和另外两个命令的工作原理又不相同,当用户输入命令时,awk从标准输入或输入文件、命令行参数中读取数据,按照用户定义的模式进行匹配,匹配成功则执行相应操作,然后将结果输出到标准输出或指定的文件中

awk 提供了三个特殊的模式,BEGIN、pattern、END

BEGIN 块在任何输入数据处理之前执行,通常用于初始化变量、设置字段分隔符、打印头信息等

pattern 块在每条记录被读取后执行,如果记录与模式匹配,则执行相应的动作

END 块在所有输入数据处理完毕后执行,通常用于打印汇总信息、关闭文件等

所以,我们可以将awk工作的流程简单地分为三个步骤:

读:从文件、管道、标准输入等中读入一行然后将其放入到内存中

执行:根据命令按序执行,默认是处理每一行,可指定需求

重复:处理完当前记录后,awk继续读取下一条记录,并重复执行上述步骤,直到所有记录都被处理完

命令格式

原理只是辅助理解,最重要的还是能灵活使用命令

awk 的命令格式是  

awk [选项]  模式或条件{操作} 文件

awk -f 脚本文件  文件

awk  关键字  选项  命令部分 '{xxxx}'  文件名

awk 支持内置变量和自定义变量

常见的内置变量有

FS:指定字段的分隔符,默认为空格或制表符

NF:当前正在处理的行的字段数,有的时候也用作表示列的个数

NR:当前处理的行的行号

$0:当前处理的行的整行

$n:当前处理行的第n个字段

FNR:各文件分别计数的行号

OFS:输出字段分隔符

ORS:输出记录分隔符

RS:记录行分隔符

案例

首先来点简单的,我们打印出第一列,就用/etc/passwd文件吧,将他拷贝到/opt目录下,方便操作,又不会对原文件产生影响

awk -F : '{print $1}' passwd               -F 指定分隔符是必须要的,不指定分隔符啥也打不出来,

                                                           passwd文件每列之间的分隔符也确实  ":"

按照规则来,便能输出你想要的结果

同时打印一二两列,并且中间用 - - 隔开 ↓

如果中间要间隔一个制表符也是可以的,将 - - 换成 \t

有的时候,一个文件里并不只是以一个符号隔开的,可能前面是: 后面还穿插着/等之类的其他分隔符,这时候我们进行筛选的时候就需要设定两个分隔符

awk -F [:/] '{print $5 "- -"$8}' passwd          还以passwd文件为例,假如有另外一个分隔符/ 

照我们这样的分法,第一行打印出来的应该是 root 和空白,因为第八列恰好在 : 和 / 之间

 我们来验证结果

事实亦是如此

简单的打印操作差不多就是这样,接下来我们要用到上面说到的那些什么 FS NR NF等内置变量

打印出含有数字的行的第一列,并显示行号

awk -F: '/[0-9]/{print NR"--"$1}' passwd               NR显示行号,和实际内容之间也是用--隔开了

结果验证无误,若想要打印出含有数字的行的这一整行,我们就不需要特别指定$几列,改成$0即可,如果什么都不加,那将会只打印行号

接着,我现在想看看,passwd文件里每一行究竟有多少列,那假如 / 也算分隔符,那又有多少列?

awk -F: '{print NF}' passwd                                 awk -F[:/] '{print NF}' passwd 

看看前几行就差不多了,就不截全了,可以看到,每行有多少列被统计了出来,因为passwd本身并没有以/为分隔符,所以第二个命令打印出来的数字参差不齐,因为路径不一样

如果嫌麻烦不想查看有多少列,就想直接打印最后一列,那么我们的列号就直接改成 $NF就可以了

行号也可以指定,比如打印第一行第一列

awk -F: 'NR==1 {print $1}' passwd

应用到实际案例中

还是以网卡为例,要求直接输出 本机的ip地址是:

ifconfig ens33 | awk '/netmask/{print "本机的IP地址是:"$2}'    

因为我们首先要筛选出含有ip地址的那一行(独有netmask的那一行,其实也可以根据自己的理解设定其他筛选条件),随后再输出ip地址所在的列

awk也可以像sed 还有 grep 那样,匹配查询一些特定的字符,比如,查找含有 root 的行

awk -F: '/root/' passwd 


awk -F: '$1~/ro/' /etc/passwd   模糊查询,查询第一列含有ro的行

如果想要查找不含ro的行,就在 ~ 号前面加一个!表示不包含

我们还可以通过用字符串来实现查找功能,只不过这个查找就是比较精确的了,输入什么字符就精确匹配什么字符,比如查找最后一列是/bin/bash的

 awk -F: '$7=="/bin/bash"' passwd    一定要加双引号,格式要正确,这样才能成功查找

我也是输了很多次发现格式有问题,最终加了双引号,加了/ 才查找成功

既然 = 号都出现了,那么 > 或者 < 应该也不意外,用法也如它们本身的含义一样,比如passwd文件里,第三列基本上都是数字,那我们就可以查找,第三列大于1000的行

不仅如此,逻辑符号也可以一并加入使用,第三列大于1000,并且小于1005

两条符合查询条件的结果被输出了出来,当然不仅可以只对数字的大小做要求,字符类型其他列等,都可以加入查询条件,具体按照什么规则来查询,就看自己的发挥了

awk同样可以选择输出偶数行还是奇数行  ,getline 读取数据时,得到的是下一行

seq 10 | awk '{getline;print $0}'    显示偶数行

seq 10 | awk '{print $0;getline}'    显示奇数行

前面提到FS、OFS、FNR 等内置变量,其实理解起来也非常简单

FS:指定字段的分隔符,默认为空格或制表符

如,我们要在在打印之前定义字段分隔符为冒号,打印第三行

awk 'BEGIN{FS=":"}{print $3}' passwd              这里BEGIN 就是在打印前做

FNR:追加行号

awk '{print FNR,$0}' passwd   就可以看到输出的内容的行号

OFS:输出字段分隔符

awk 'BEGIN{FS=":";OFS="- -"}'      这个结果的输出命令就和之前

awk -F [:/] '{print $5 "- -"$8}' passwd 输出效果一样,我就不演示了

ORS:输出记录分隔符

awk 'BEGIN{ORS=" "}{print $0}' passwd  

把多行合并成一行 输出,输出的时候自定义以空格分隔每行,默认是回车键

RS:记录行分隔符

awk 'BEGIN{RS=":"}{print $0}' /etc/passwd    

指定以什么为换行符,这里指定是冒号,指定的肯定是原文里存在的字符


awk 拥有一个特殊的功能,那就是可以加入条件判断语句或者循环语句等

awk if语句

还是passwd文件,比如,如果第三列大于1000,那就打印第三列,否则打印第一列

awk -F: '{if($3>1000){print $3}else{print $1}}'  passwd

因为文件里的行数太多,我就不截全了,逻辑上来说,排除用户名就是数字的,输出结果中,应该全是大于1000的数字,如果不是数字,那就都是passwd文件中的用户名

awk数组

看到数组会觉得头疼吗?还好,awk里的数组目前用不到十分困难的,我们只需要会如何定义如何输出就好了

awk 'BEGIN{a[0]=10;a[1]=20;print a[1]}'           定义了a[0] a[1] 并打印a[1]

相应的,打印a[0] 输出结果肯定就是10了

awk 'BEGIN{a["abc"]=10;a["xyz"]=20;print a["abc"]}'        和上面一个意思

awk循环

上面的数组定义完,我们就可以插入循环啦

awk 'BEGIN{a[0]=10;a[1]=20;a[2]=30;for(i in a){print i,a[i]}}'      定义一个数组,再让i对应数组元素,并进行打印

awk '{line[NR] = $1} END{for(i in line){print "Line " i ":" line[i]}}' xslx.txt

 将每一行的第一个字段存储在数组 line 中,使用行号 NR 作为索引,然后用for循环遍历数组,并打印每个元素及其索引

awk 的用法基本上就这么多,然后至此文本编辑三剑客的讲解也就圆满结束了,功能很多,所以东西也很多很杂,多敲多练熟稔于心

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

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

相关文章

关于使用Postman在请求https网址没有响应,但是用浏览器有响应的问题解决

一、问题描述 使用postman调用正式环境的公共接口&#xff0c;无需鉴权&#xff0c;但是产生了返回状态码200&#xff0c;但是data中却无数据&#xff0c;如下 {"code": "200","message": "操作成功","data": {"qr_c…

【图解网络】学习记录

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 TCP/IP 网络模型有哪几层&#xff1f;键入网址到网页显示&#xff0c;期间发生了什么&#xff1f;Linux 系统是如何收发网络包的&#xff1f;NAPIHTTP 是什么&#…

Flask Bootstrap #3 - BootStrap快速入门

Reference https://www.bilibili.com/video/BV1AQe9eqEj7/?p2&spm_id_frompageDriver&vd_source3d4b12fb4a4bfbc98942d43612ae2fb9 1 BootStrap BootStrap&#xff0c;别人写好的一堆css样式&#xff0c;我们可以直接拿过来用&#xff0c;我们只要掌握两点就可以开…

【TabBar嵌套Navigation案例-自定义tabBar-封装 Objective-C语言】

一、再来说一个自定义tabbar的问题啊, 1.首先呢,这个tabbar,看起来好像效果是实现了,没有什么问题,但是说,从业务逻辑上来讲的话,这样做,是不太好的, 1)首先,我们去创建啊,我们自定义的一个UIView, UIView里边,有很多子控件,那么这个子控件,应该是写在你这个V…

kubernetes管理GUI工具Lens

从github上可以知道&#xff0c;lens的前端是用electron做的客户端工具&#xff0c;打开安装路径你会发现kubectl.exe,没错&#xff0c;就是你经常用的kubectl命令行的客户端工具。kubectl本来就能输出json的数据类型&#xff0c;集成前端更方便了。看到这里你是不是发现&#…

MoE技术揭秘——混合专家模型的计算奥秘

MoE技术揭秘——混合专家模型的计算 MoE技术的类比 你可以把MoE技术比作一个“智能团队”&#xff0c;团队中的每个成员&#xff08;专家&#xff09;都有自己擅长的领域。当面对一个问题时&#xff0c;只有擅长此问题的成员才会参与解答&#xff0c;这样既提高了效率&#xff…

如何开发属于自己直播平台的主播美颜SDK?

本篇文章&#xff0c;笔者将从需求分析、技术选型、开发流程等方面进行详细讲解。 一、需求分析 在开发美颜SDK之前&#xff0c;首先需要进行详细的需求分析。主要包括以下几个方面&#xff1a; 1.美颜功能的具体需求&#xff1a;确定美颜效果&#xff0c;包括磨皮、美白、瘦…

懂个锤子Vue 项目工程化扩展:

Vue项目工程化扩展&#x1f4f6;&#xff1a; 前言&#xff1a;当然既然学习框架的了&#xff0c;HTMLCSSJS三件套必须的就不说了&#xff1a; JavaScript 快速入门 紧跟前文&#xff0c;目标学习Vue2.0——3.0&#xff1a; 懂个锤子Vue、WebPack5.0、WebPack高级进阶 涉及的…

4418 4412 的 bl1 , bl2 的理解

之前一直 对 三星的 bl1 , bl2 不是很理解。 网上的资料 我自己的 测试&#xff1a; 我在 4418 的源码中没有找到这个 2ndboot 文件夹。

仅花3小时搭好一套仓库管理系统,老板看了直呼哇塞

公司仓库管理长期效率低下&#xff0c;让团队头疼不已。没想到&#xff0c;一位同事凭借自学的零代码系统搭建技能&#xff0c;仅用时3小时就搭建出了一套完善的仓库管理系统&#xff0c;不仅操作简便&#xff0c;还大幅提升了工作效率。老板亲自验收后连连夸赞直接给了1w奖金&…

Unity Yaml

资料 UnityYaml 项目设置 选择用于存储序列化资产的格式 Project Settings->Asset Serialization->Mode Force Text 序列化为文本文件,例如场景文件 保存为yaml格式 方便查看&#xff1b;版本控制时文本文件比二进制文件更容易合并Force Binary 序列化为二进制文件&a…

图片格式怎么转换?这几种图片格式转换方法简单又高效

图片已成为我们日常生活与工作中不可或缺的一部分。然而&#xff0c;不同平台和应用往往对图片格式有着特定的要求&#xff0c;这就使得图片格式的转换成为了一项必备技能。下面给大家分享5种能够简单高效的转换图片格式方法&#xff0c;快来一起学习下吧。 方法一&#xff1a;…

隆尧县“隆品佳尧”区域公用品牌发布推介会暨地标之都七月选品会成功举办

在国家乡村振兴战略与农业现代化建设的大背景下&#xff0c;隆尧县凭借其得天独厚的地理优势和丰富的自然资源&#xff0c;正在成为区域经济与品牌建设的一颗新星。为了进一步推动隆尧县的农业发展和乡村建设&#xff0c;由隆尧县商务局指导、隆尧县电子商务公共服务中心主办的…

GD 32独立看门狗

前言 ... 独立看门狗简介 独立看门狗定时器(FWDGT)有独立的时钟源(IRC40K)。因此就算是主时钟失效了&#xff0c;它仍然能保持工作状态&#xff0c;这非常适合于需要独立环境且对计时精度要求不高的场合。 当内部向下计数器的计数值达到0&#xff0c;独立看门狗会产生一个复位…

迎接新时代:通过Web Distribution分发您的iOS应用

背 景 《数字市场法案》&#xff08;Digital Markets Act&#xff0c;DMA&#xff09;是欧盟委员会于2020年11月提出的旨在规范大型科技公司行为的立法提案&#xff0c;于2022年3月8日由欧盟议会和欧盟理事会正式通过&#xff0c;并于2022年11月1日正式生效&#xff0c;主要条…

面试题:MySQL 索引

1. 谈一下你对于MySQL索引的理解?(为什么MySQL要选择B+树来存储索引) MySQL的索引选择B+树作为数据结构来进行存储,使用B+树的本质原因在于可以减少IO次数,提高查询的效率,简单来说就是可以保证在树的高度不变的情况下存储更多的数据: IO效率的提高:在MySQL数据库中,…

最细哈希表相关的力扣题和讲解和Java、C++常用的数据结构(哈希法)来源于代码随想录,十分感谢这位我失散多年的老师!!

20240725 一、什么时候适用什么样的结构。1.java中1.1 HashSet&#xff1a;1.2 TreeSet&#xff1a;1.3 LinkedHashSet&#xff1a;1.4 HashMap&#xff1a;1.5 TreeMap&#xff1a;1.6 LinkedHashMap&#xff1a;1.7 总结 2. c中2.1 std::unordered_set&#xff1a;2.2 std::s…

mysql 的MHA

mysql 的MHA 什么是MHA 高可用模式下的故障切换&#xff0c;基于主从复制。 单点故障和主从复制不能切换的问题。 至少需要3台。 故障切换过程0-30秒。 vip地址&#xff0c;根据vip地址所在的主机&#xff0c;确定主备。 主 vip 备 vip 主和备不是优先确定的&#xff…

机器视觉13镜头

镜头作用&#xff1a; 一端收集物体的光线&#xff0c;并将光线在另一端汇聚为实像&#xff0c;并投影到接收面的物体。 此时&#xff0c;汇集光线的点称为焦点&#xff0c;镜头中心到焦点的距离称为焦点距离。 当镜头为凸镜时&#xff0c;焦点距离将根据镜头的厚度&#xf…

必看!CRM系统选型指南:10款CRM系统对比,你该用哪个?

不同行业、不同规模、不同业务模式的企业&#xff0c;对CRM系统的需求千差万别。 如何在众多选择中挑选出最适合自己企业的那一款&#xff0c;成为了许多管理者面临的难题。因为&#xff0c;如今的CRM系统成为了企业提升竞争力、深化客户关系、优化业务流程的关键工具。 因此…