RHCE---shell脚本编程之awk

news2024/11/15 13:34:46

文章目录

  • 目录

    文章目录

    前言

     一.awk概念

     二.工作流程

     三.awk执行方式

     四.awk 语法结构及案例

    纯命令执行脚本 

     awk命令调用脚本执行

     直接awk纯脚本执行

    五.记录和域

     概念:

     六.awk的变量

    总结


前言

前文已详细了介绍了文本三剑客的其中两种grep 和 sed 命令,本文将介绍文本三剑客中的最后一种awk。


 一.awk概念

    AWK是一种用于文本处理和数据提取的工具。 它可以在命令行中使用,也可以作为脚本运行。 AWK通过处理文本流行来实现数据提取、格式化输出等功能  。

    awk 还是一种编程语言环境,它提供了正则表达式的匹 配,流程控制,运算符,表达式,变量以及函数等一系列 的程序设计语言所具备的特性,它从C语言中获取了一些 优秀的思想

 二.工作流程

  •  第一步:自动从指定的数据文件中读取行文本。
  • 第二步:自动更新awk的内置系统变量的值,例如列数变 量NF、行数变量NR、行变量 以及各个列变量1、$2等等
  • 第三步:依次执行程序中所有的匹配模式及其操作
  • 第四步:当执行完程序中所有的匹配模式及其操作之后, 如果数据文件中仍然还有为读取的数据行,则返回到第 (1)步,重复执行(1)~(4)的操作

 三.awk执行方式

任何awk语句都由模式( pattern )和动作( action )组成

  • 模式:由一组用于测试输入行是否需要执行动作的规则
  • 动作:包含语句,函数和表达式的执行过程
  • 简言之,模式决定动作何时触发事件,动作决定执行的处理动作

 四.awk 语法结构及案例

 语法结构

纯命令执行脚本 

awk 'pattern {action}' file#代表需要被执行的文件
#pattern是正文模式,用于筛选输入数据的行
#上述pattern是三种模式中的一种,剩余两种模式分别是begin和end模式
#action是执行动作,用于对符合特定条件的行执行某些操作
  •  begin模式:处理正文之前的准备工作都在此模式下执行
  • end模式:正文处理结束退出之前的工作都在此模式下执行,简称收尾模式
  • 例如:awk命令是执行依次正文内容输出一个结果,想要将正文全部处理结束之后一次性输出处理结果,则需要将输出工作放到end模式下

格式: 

awk 'BEGIN{ commands } {print item1,item2,……} END{ commands }' [INPUTFILE…]
#begin 模式 命令用逗号隔开 输出以空格输出

参数: 

  1. -F:指定分隔符
  2. -v:定义变量
  3. -f:从文件中读取awk脚本
  4. -F: '{print $2}':指定脚本
  5. -NR:输出指定范围的行
  6. -NF:输出当前行的字段数
  7. -OFS:指定输出分隔符
  8. -ORS:指定输出行分隔符
  9. -i:直接修改文件

 案列 1:

[root@timeserver ~]# vim input
#输入多个回车制造多个空白行

[root@timeserver ~]#  awk '/^$/{print   "This is a blank line"}' input
This is a blank line
This is a blank line
This is a blank line
This is a blank line
#脚本调用流程为:模式条件/^$/检索空白行,匹配到一个空白行执行一个动作:print   "This is a blank line

 案例 2:

[root@server ~]# awk 'BEGIN{print "BEGIN ...."} {print $0}   END{print "The End"}' /etc/fstab
# $0 代表这一行的所有列

上述命令执行流程: 

#首先执行begin 模式打印一个抬头信息 ....
#接着执行pattern模式处理正文(print $0),读取正文第一行的所有列然后输出,
#第一行处理结束输出之后继续处理第二行输出,awk是按行顺序进行处理的
#最后执行end模式,进行最后的收尾工作

 awk命令调用脚本执行

  •  推荐模式和动作有多个时使用此方式执行
[root@server ~]# vim scr.awk
#编辑以下内容
/^$/{print   "This is a blank line"}
#使用awk命令调用脚本执行
[root@server ~]# awk -f scr.awk input
This is a blank line
This is a blank line
This is a blank line

 直接awk纯脚本执行

[root@server ~]# vim scr.awk
#首先编辑抬头申明脚本解释器
#!/bin/awk -f
/^$/{print   "This is a blank line"}
#使用如下命令执行脚本
[root@server ~]chmod o+x scr.awk
[root@server ~]./scr.awk   inout#被处理的文件名

五.记录和域

 概念:

 域:在awk中,域(field)是一行文本中的一个单独的数据项,通常由空格或制表符分隔。默认情况下,awk将输入行按照空格或制表符来划分域,默认为空格或tab

 记录:记录(record)是指awk处理的一行完整的输入文本。默认情况下,记录是以换行符为分隔符来定义的。在awk中,每个记录可以包含多个域,每个域可以通过域分隔符来分隔。$1表示第一个域 $0表示所有域 。

简尔言之:记录代表行,域代表列

 案例1:处理每一行每一列

[root@timeserver ~]# awk '{print $0}' awk1.txt
#截取第一列为$1 第二列为$2

 案例2:$之后的域使用变量定义

[root@server ~]# awk 'BEGIN{one=1 ; two=2} {print $(one+two)}' awk1.txt 

 案例3:查询包含 l 的行显示第三列

[root@server ~]# awk '/^l/{print $3}' awk1.txt

案列4: 输出所有账户

[root@server ~]# awk -F ":" '{print $1}' /etc/passwd
  •  awk默认识别空格来识别列与列,特殊文件中没有空格及awk默认识别的分隔符
  • 需要使用参数 -F 来指定分割符

 六.awk的变量

$0: 记录变量表示所有域(列) $n 字段变量,表示第n个域(列)

NF: 当前记录的域个数

NR :显示每一行的行号

FS: 输入字段分隔符,默认值是空格或者制表 符,可使用-F指定分隔符

OFS: 输出字段分隔符 ,OFS=”#”指定输出分割符 为# RS 记录分隔符,默认值是换行符 \n ENVIRON:当前shell环境变量及其值的关联数组

FILENAME:被awk处理的文件名

案列1:输出所有账户

[root@server ~]# awk 'BEGIN{FS=":"} {print $1}' /etc/passwd
#在begin 模式下设置分隔符

 案列2:使用 NR NF显示行数 列数

[root@server ~]# awk '{print NF,NR,$0} END{print FILENAME}' awk1.txt 
#FILENAME 代表处理的文件名

[root@server ~]# awk '{print "第",NR,"行","有",NF,"列"}' > "/root/t1.txt" awk1.txt

 

 案例 3:

[root@server ~]# awk -F ":" 'BEGIN{OFS="\t"} {print   $1,$3}' /etc/passwd

 案例4:

[root@server ~]# vim awk2.txt
zhangsan  68 88 92 45 71
lisi      77 69 43 52 84
wangwu    61 99 85 77 56


[root@server ~]# vim test.awk
{
       print
       print  "$0:" , $0
       print  "$1:" , $1
       print  "$2:" , $2
       print  "NF:" , NF
       print  "NR:" , NR
       print  "FILENAME: " , FILENAME
}       

[root@server ~]# awk -f test.awk  awk2.txt
#执行过程如下
#awk按行处理,执行第一条命令

 处理结果如下

zhangsan  68 88 92 45 71
$0: zhangsan  68 88 92 45 71
$1: zhangsan
$2: 68
NF: 6
NR: 1
FILENAME: awk2.txt
lisi      77 69 43 52 84
$0: lisi      77 69 43 52 84
$1: lisi
$2: 77
NF: 6
NR: 2
FILENAME: awk2.txt
wangwu    61 99 85 77 56
$0: wangwu    61 99 85 77 56
$1: wangwu
$2: 61
NF: 6
NR: 3
FILENAME: awk2.txt


总结

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

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

相关文章

C++查看Class类结构

cl指令 cl test.cpp /d1reportSingleClassLayout 类名 注意。上面指令是d1,1是数字1 , 不是字母l;

深度解析concrt140.dll丢失的5个解决方法,快速搞定dll问题

在计算机使用过程中,我们经常会遇到一些错误提示,其中之一就是“concrt140.dll丢失”。这个问题通常会导致某些应用程序无法正常运行,给用户带来困扰。本文将介绍一种有效的解决方法,帮助用户解决concrt140.dll丢失的问题。 一、原…

时序分解 | Matlab实现NGO-VMD北方苍鹰算法优化变分模态分解时间序列信号分解

时序分解 | Matlab实现NGO-VMD北方苍鹰算法优化变分模态分解时间序列信号分解 目录 时序分解 | Matlab实现NGO-VMD北方苍鹰算法优化变分模态分解时间序列信号分解效果一览基本介绍程序设计参考资料 效果一览 基本介绍 北方苍鹰算法NGO优化VMD,对其分解层数&#xff…

【Algorithm】最容易理解的蒙特卡洛树搜索(Monte Carlo Tree Search,MCTS)算法

看了不少解读和笔记,本文把最容易理解的解读做个总结。 1. 蒙特卡洛方法 蒙特卡洛方法(Monte Carlo method),是一种“统计模拟方法”。20世纪40年代,为建造核武器,冯.诺伊曼 等人发明了该算法。因赌城蒙特卡洛而得名&#xff0c…

【HSPICE仿真】输入网表文件(6)用户自定义分析输出(.measure)

.measure语句的基本用法 1. 语句顺序2. 测量参数类型3. Rise, Fall, Delay, and Power Measurements4. FIND 和 WHEN 函数5. Equation Evaluation/Arithmetic Expression6. AVG, EM_AVG, INTEG, MIN, MAX, PP, and RMS基本语法示例 7. 输出文件格式MEASFORMMEASOUTMEASFILEMEAS…

程序员想要网上接单却看花了眼?那这几个平台你可得收藏好了!

现在经济压力这么大,但是生活成本还在上升,相信大家都知道“四脚吞金兽”的威力了吧!话虽如此,但是生活总得继续,为了家庭的和谐幸福,为了孩子的未来,不少人选择多干几份工作,赚点外…

多态与虚函数、虚函数表、对象的内存模型的思考

我在这就不详细说多态、虚函数是什么了,简单理解为: 1.基类定义虚函数 2.派生类重定义/重写(override)基类的虚函数 3.基类指针(引用)指向(绑定)到派生类对象 4.基类指针&#xff08…

大数据Doris(十五):Doris表的字段类型

文章目录 Doris表的字段类型 一、TINYINT数据类型 二、SMALLINT数据类型 三、INT数据类型

以太网【FPGA】

1物理: 2接线: 信号名 信号类型 对应引脚 备注 sys_clk Input B5 系统晶振输入时钟,频率 50MHz sys_rst_n Input E8 系统复位信号,低有效 eth_rxc Input E17 PHY 输入时钟,频率 125MHz eth_rx_ctl Inpu…

傅里叶分析和小波分析

从傅里叶变换到小波变换,并不是一个完全抽象的东西,可以讲得很形象。小波变换有着明确的物理意义,如果我们从它的提出时所面对的问题看起,可以整理出非常清晰的思路。 下面我就按照傅里叶-->短时傅里叶变换-->小波变换的顺…

损失函数(Loss Function)一文详解-聚类问题常见损失函数Python代码实现+计算原理解析

损失函数(Loss Function)一文详解-聚类问题常见损失函数Python代码实现计算原理解析 前言 损失函数无疑是机器学习和深度学习效果验证的核心检验功能,用于评估模型预测值与实际值之间的差异。我们学习机器学习和深度学习或多或少都接触到了损失函数,但…

SuperMap iServer 11i(2023)安全性提升汇总

作者:lisong 目录 账户信息合规度校验规则扩展功能图片验证码登录功能Web服务提供者密码加密数据库密码加密漏洞修复 SuperMap iServer 11i(2023)产品安全性相关的提升众多,涵盖账户安全、服务安全以及漏洞修复等方面,…

2023杭州·云栖大会:我在云栖看数智中国

目录 模型即服务(MaaS,Model as a Service)全球首个李白数字展我在云栖看数智中国 云栖之眼、视频云3D渲染、数字人…… 10月31日到11月2日,2023云栖大会在杭州市西湖区云栖小镇火热进行,本次的主题为“ 计算&#xff…

YOLO目标检测——红外多目标检测数据集【含对应voc、coco和yolo三种格式标签】

实际项目应用:自动驾驶、安防监控等数据集说明:红外多目标检测数据集,真实场景的高质量图片数据,数据场景丰富,含有行人、汽车、自行车、摩托、消防栓、指示牌、狗等图片标签说明:使用lableimg标注软件标注…

题解数量上三百了

题解数量上三百了 持之以恒,不断进步。

近独立粒子的最概然分布

近独立粒子:粒子之间相互作用微弱基本粒子中,自旋量子数为半整数的有 电子 、 质子 、中子、中微子自旋量子数为整数的有 光子、pi介子 经典力学描述系统的微观运动状态 经典力学中,全同粒子可以分辨量子力学,全同粒子不可以分辨微…

JMeter接口测试性能测试

目前最新版本发展到5.0版本,需要Java7以上版本环境,下载解压目录后,进入\apache-jmeter-5.0\bin\,双击ApacheJMeter.jar文件启动JMemter。 1、创建测试任务 添加线程组,右击测试计划,在快捷菜单单击添加-…

【腾讯云 HAI域探秘】基于ChatGLM和StableDiffusion的小学一年级语文教学方案创作实践与经验分享

前言 目前腾讯云HAI正在内测中,腾讯云HAI为开发者量身打造的澎湃算力平台。无需复杂配置,便可享受即开即用的GPU云服务体验。在 HAI 中,根据应用智能匹配并推选出最适合的GPU算力资源,以确保您在数据科学、LLM、AI作画等高性能应用…

Java 算法篇-深入了解二分查找法

🔥博客主页: 小扳_-CSDN博客 ❤感谢大家点赞👍收藏⭐评论✍ 目录 1.0 二分查找法的说明 2.0 二分查找实现的多种版本 2.1 二分查找的基础版本 2.2 二分查找的改动版本 2.3 二分查找的平衡版本 2.4 二分查找的官方版本 3.0 二分查找的应用 1…

OpenCV的绘图工具(rectangle、circle、line、polylines、putText)常用方法简介【C++的OpenCV 第十五课】

🎉🎉🎉 欢迎各位来到小白 p i a o 的学习空间! \color{red}{欢迎各位来到小白piao的学习空间!} 欢迎各位来到小白piao的学习空间!🎉🎉🎉 💖 C\Python所有的入…