Shell脚本攻略:文本三剑客之awk

news2024/11/27 3:48:12

目录

一、理论

1.awk原理

2.awk打印

 3.awk条件判断

4.awk数组与循环

5.awk函数

6.常用命令

二、实验

1.统计磁盘可用容量

2.统计/etc下文件总大小

3.CPU使用率

4.统计内存

5.监控硬盘


一、理论

1.awk原理

(1)概念

awk由 Aho,Weinberger 和 Kernighan 创建的文本模式扫描和处理语言。

awk非常复杂,所以这不是一个完整的指南,但应该给你一个知道什么 awk 可以做。它使用起来比较简单,强烈建议使用。

(2)基本格式

awk  [选项]   '处理模式或条件{处理动作}'  文件名

'{ }'为固定格式

(3)内置变量

内置变量,不能用双引号括起来,不然系统会把它当成字符串。

表1 内置变量

内置变量功能
$0当前处理的行的整行内容  打印所有
$n当前处理行的第n个字段(第n列)
NR当前处理的行的行号(序数)
NF当前处理的行的字段个数。$NF代表最后一个字段
FS列分割符。指定每行文本的字段分隔符,输入内容的分隔符,
默认为空格或制表位。与"-F"作用相同 用-F可以不加单引号 -F:,用FS必须用=""
 
OFS输出内容的列分隔符,默认为空格
ORS输出记录分隔符,默认为换行符\n
FILENAME被处理的文件名
RS行分隔符。awk从文件中读取资料时,
将根据RS的定义把资料切割成许多条记录,而awk一次仅读入一条记录进行处理。默认为换行符\n

(4)处理动作

①基本格式:awk  [选项]   '处理模式或条件{处理动作}' 文件名

②print动作:打印,打印'{print $1}'即为打印第一列,'{print $n}'即打印为第n列,'{print $n,$m}'即为打印第n列和第m列。

③print打印顺序:'BEGIN{print "1"} END {print  "2"}  {print "3"} ',首先打印BEGIN后的print 1,然后打印print 3  最后打印END后的print 2,BEGIN表示第一个打印,END表示最后打印

(5)选项

① 基本格式:awk  [选项]   '处理模式或条件{处理动作}' 文件名

② 选项若不写默认为以空格为分隔符处理,且会将空格自动压缩。

③ -F 选项 指定分隔符,即指定以什么为分隔符处理内容


注意一定是单引号:'模式或条件 {操作}'

{ }外指定条件,{ }内指定操作。

表2 选项

选项功能
-F“分隔符” 指明输入时用到的字段分隔符,默认的分隔符是若干个连续空白符
-v(小v)var=value 变量赋值

(6)处理模式

①基本格式:awk  [选项]   '处理模式或条件{处理动作}' 文件名

②处理模式为空表示无其他额外条件。

③正则表达式匹配模式

正则匹配:与正则表达式配合使用。

2.awk打印

(1)基本打印用法

① 基本打印

指定行号

打印行号和内容

打印第3行

打印第3行到第5行

打印第3行和第5行

奇偶行打印:

打印偶数

打印奇数

awk运算:

运算

先打印行,再跳行(奇数)

先跳行,再打印(偶数)

(2)文件内容匹配过滤

与正则表达式配合使用:

(3)BEGIN打印模式

格式:awk 'BEGIN{...};{...};END{...}' 文件
处理过程:
① 在awk处理指定的文本之前,需要先执行BEGIN{...}模式里的命令操作
② 中间的{...} 是真正用于处理文件的命令操作
③ 在awk处理完文件后才会执行END{...}模式里的命令操作。END{ }语句块中,往往会放入打印结果等语句。

BEGIN END模式

-v

(4)BEIGIN模式指定

BEGIN模式在awk执行前改变分隔符,执行过程中,以“:”分割,打印指定内容

指定换行符

(5)awk的三元表达式

wk的三元表达式继承了java的用法,格式与Java相似

格式:awk '(条件表达式)?(A表达式或者值):(B表达式或者值)'

三元表达式(面试):

将变量 max 设置为输入行字段 3 和 4 之间的最大值。
? : 运算符是 if-else 语句的简写,因此此行等效于 if ($3 >= $4) { max=$3 } else { max=$4 }

取比较结果的最大值,赋值给变量max,并且输出max行的所有内容,然后打印其中的1-6行;

(6)awk的精准筛选

awk支持使用正则进行模糊匹配,也支持字符串和数字的精确匹配,并且支持逻辑与和逻辑或

表2 条件匹配

比较符号描述
//全行数据正则匹配
!//对全行数据正则匹配后取反
~//对特定数据正则匹配
!~//对特定数据正则匹配后取反
==等于
!=不等于
>大于
>=大于等于
<小于
<=小于等于
&&逻辑与,如A&&B,要求满足A并且满足B
||逻辑或,如A||B,要求满足A或者满足B

表3 awk的精准筛选

变量功能
$n(> < ==)用于对比数值
$n~"字符串"代表第n个字段包含某个字符串
$n!~"字符串"代表第n个字段不包含某个字符串
$n=="字符串"代表第n个字段为某个字符串
$n!="字符串"代表第n个字段不为某个字符串
$NF代表最后一个字段

-F

小于等于10 uid

取反

(7)awk的分隔符用法

① RS 指定行分隔符:

awk从文件中读取资料时,将根据RS的定义把资料切割成许多条记录,
而awk一次仅读入一条记录进行处理。内置变量RS的预设值是"\n" 也就是换行。
也可以使用BEGIN模式在操作前进行行分隔符的改变。

② 指定输出的分隔符:

OFS:输出内容的列分隔符。($n=$n用于激活,否则不生效,n必须存在)
对于输出时改变分隔符,我们常用到tr,awk,它们都可以实现在输出内容改变原本的分隔符

③ awk改变输出分隔符

精准筛选

逻辑且

 3.awk条件判断

(1)条件判断打印

if判断后面如果只有一个动作指令,则花括号{}可省略,如果if判断后面的指令为多条指令则需要使用花括号括起来,多个指令使用分号分隔。

使用了if语句,内部条件(),外部条件{},整个加{}作为一条语句执行,相当于嵌套语法

单分支语法

if(判断条件){
动作指令序列;
}

查找cpu使用率大于0.3的进程:

ps -eo user,pid,pcpu,comm | awk '{if($3>0.5) print}'

双分支语法

if(判断条件){
动作指令1;
} else {
动作指令2;
}

统计系统用户与普通用户的个数:

awk -F: '{if($3<1000){x++} else{y++}} END{print "系统用户个数:"x"","普通用户个数:"y""}' /etc/passwd

③ 多分支语句

if(判断条件){
动作指令1;
} else if(判断条件2){
动作指令2;
} else {
动作指令N;
}

If条件:

4.awk数组与循环

 awk结合数组运用

awk中定义数组打印:

数组遍历

语法:

for(变量 in 数组名){
动作指令序列
}

awk中的数组形成遍历,处理文件去重统计:

Awk结合数组去重

出现几次赋值几次,把$1的值作为索引下标

②for循环

采用与C语言一样的语法格式

for(表达式1;表达式2;表达式3) {
动作指令序列
}
awk 'BEGIN{ for (i=1;i<=4;i++) {print i}}'

awk -F: '{ \
for(i=1;i<=NF;i++) \
> {if($i=="root") x++} \
> } END {print x}' /etc/passwd

③ while循环

语法:

while(条件判断){
动作指令序列;
}
awk 'BEGIN{ i=1; while(i<=5) {print i;i++}}'

④ 中断语句

与shell类似,awk提供了continue、break、exit循环中断语句。

awk 'BEGIN{ \
i=0;
while(i<=5) { \
i++; \
if(i==3) {continue}; \
print i \
}; \
} \
END {print "END"}' /tmp/hosts

5.awk函数

(1)内置I/O函数

 getline

能让awk立刻读取下一行数据(读取下一条记录并复制给$0,并重新设置NF、NR和FNR).

#解决挂载逻辑卷时,分区信息跨行显示的问题
df -h | awk '{if(NF==1) {getline;print $3}; if(NF==6) {print $4}}'

getline的工作过程:
1)当getline左右无重定向符号(“<”,">")或者管道符号(“|”)时,
awk首先读取的是第一行,而getline获取的是光标跳转至下一行的内容(也就是第二行)。

2)当getline左右有管道符号或重定向符时,
getline则作用定向输入文件,由于文件是刚打开,并没有被awk读入一行,
而只是getline读入,所以getline返回的是文件的第一行,而不是跳转至一行输入

原因:getline运行之后awk会改变NF,NR,$0,FNR等内部变量,所以此时读取$0的行号不再为1,而是2。

重定向:

getline 管道服 (赋值变量):

② next函数

停止处理当前的输入记录,立刻读取下一条记录并返回awk程序的第一个模式匹配重新处理数据。
有点类似于循环语句中的continue,不会执行当次循环的后续语句

awk -F: '/root/{getline;print "next line:",$0} {print "normal line"}' /etc/passwd
awk -F: '/root/{next;print "next line:",$0} {print "normal line"}' /etc/passwd

总结:getline,会继续执行后续的指令print “next line:”,而next不会执行后续指令,而是重新开始匹配。

system(命令)函数

可以直接在awk中调用shell命令,会启动一个新shell进程执行命令。

awk 'BEGIN{system("ls")}'
awk '{system("echo date:"$0)}' /tmp/hosts

(2)内置数值函数

cos(expr)、sin(expr)、sqrt(expr)

int(expr)函数

可以对小数取整

 awk 'BEGIN{print int(6.8)}'
6

rand()函数

返回0到1之间的随机数

awk 'BEGIN{print rand()}'
awk 'BEGIN{for(i=1;i<=5;i++) print int(100*rand())}'	#生成5个100以内的随机数

srand([expr])

可以使用expr定义新的随机数种子,没有expr时则使用当前系统的时间为随机数种子

awk 'BEGIN{srand();print rand()}'		#使用时间做随机数种子
awk 'BEGIN{srand(22);print rand()}'		#使用数值做随机数种子

(3)内置字符串函数

length([s])函数

可以统计字符串s的长度,如果不指定字符串s则统计$0的长度

awk 'BEGIN{test="hello"; print length(test)}'		#打印字符串长度
awk 'BEGIN{t[0]="hi";t[1]="the"; print length(t)}'	#返回数组元素个数
awk '{print length()}' /etc/shells					#返回文件每行的字符长度

index(字符串1,字符串2)

返回字符串2在字符串1中的位置

awk 'BEGIN{test="hello";print index(test,"l")}'

match(s,r)

根据正则表达式r返回其在字符串s中的位置坐标

awk 'BEGIN{print match("How much","[a-z]")}'	#小写字母在第2个位置开始出现
2

tolower(srt)

可以将字符串转换为小写

awk 'BEGIN{print tolower("HELLo")}'
hello

toupper(str)

将字符串转为大写

split(字符串,数组,分隔符)

将字符串按特定的分隔符切片后存储在数组中,如果没指定分隔符,则使用IFS定义的。
数组下标从1开始

awk 'BEGIN{split("hello world",test); print test[1],test[2]}'
awk 'BEGIN{split("hello:world",test,":"); print test[1],test[2]}'	#指定冒号(:)为分隔符

gsub(r,s,[,t])

将字符串t中所有与正则表达式r匹配的字符串全部替换为s,如果没有指定字符串t,则默认对$0进行替换操作

 head -1 /etc/passwd | awk '{gsub("[0-9]","**");print $0}'
root:x:**:**:root:/root:/bin/bash

sub(r,s,[,t])

与gsub类似,但仅替换第一个匹配的字符串,而不是替换全部

substr(s,i,[,n])

对字符串s进行截取,从第i位开始,截取n个字符串,如果n没有指定则一直截取到字符串s的末尾位置

awk 'BEGIN{hi="Hello World"; print substr(hi,2,3)}'	#从第2位开始截取3个字符
ell

(4)内置时间函数

systime()
返回当前时间距离1970-01-01 00:00:00有多少秒

awk 'BEGIN{print systime()}'

(5)用户自定义函数

语法:

function 函数名(参数列表) { 命令序列 }
awk ' \
function max(x,y) { \
if(x>y) {print x} \
else {print y} } \
BEGIN {max(5,6)} '

6.常用命令

cat example.txt | awk 'NR%2==1' 	#删除example.txt文件中的所有偶数行
echo "    false" |awk -F' ' '{print $NF}'		#去掉前面的空格
docker images | grep 'mysql' | awk '{printf"%s:%s\n",$1,$2}'	#获取镜像名:Tag
ps -ef | grep java | grep -v 'color' awk '{for (i=8;i<=NF;i++)printf("%s ", $i);print ""}' #获取从第八列开始到最后一列的内容

二、实验

1.统计磁盘可用容量

(1)运行结果

2.统计/etc下文件总大小

(1)运行结果

3.CPU使用率

(1)运行结果

 

4.统计内存

(1)脚本截图

(2)运行结果

5.监控硬盘

(1)脚本截图

(2)运行结果

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

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

相关文章

PriorityBlockingQueue的介绍及方法内部实现

SynchronousQueue的介绍 SynchronousQueue是一个优先级队列&#xff0c;不满足先进先出FIFO的概念。 会将插入的数据进行排序&#xff0c;输出排序之后的结果&#xff08;小根堆&#xff0c;由小变大升序&#xff09; 内部实现原理介绍 SynchronousQueue是基于二叉堆结构实现…

Linux——多线程

Linux多线程 多线程进程内进行资源划分什么是线程进一步理解线程线程的优缺点Linux进程VS线程线程的异常 创建线程两个的接口线程的控制线程的创建线程的终止线程的等待线程取消C的线程库线程的分离如何理解每个线程都有自己独立的栈结构 封装线程接口 多线程 进程内进行资源划…

Java代码块和属性的赋值顺序

代码块 类的成员之四&#xff1a;代码块(初始化块)&#xff08;重要性较属性、方法、构造器差一些&#xff09; 1.代码块的作用&#xff1a;用来初始化类、对象的信息 2.分类&#xff1a;代码块要是使用修饰符&#xff0c;只能使用static 分类&#xff1a;静态代码块 vs 非静态…

nacos升级到2.0.3(单机模式)

前提&#xff1a;https://github.com/alibaba/spring-cloud-alibaba/wiki/版本说明 Spring Cloud AlibabaSpring CloudSpring BootNacos2.2.7.RELEASESpring Cloud Hoxton.SR122.3.12.RELEASE2.0.3 一、pom.xml文件 <parent><groupId>org.springframework.boot&…

网工内推 | 高级网工专场,上市公司,3年经验以上,HCIE证书优先

01 名创优品&#xff08;广州&#xff09;有限责任公司 &#x1f537;招聘岗位&#xff1a;高级网络工程师 &#x1f537;职责描述&#xff1a; 1、负责集团总部有线&#xff06;无线、公有云、仓库的网络规划建设与运维&#xff1b; 2、负责公有云的网络台日常上线部署、规划…

3.3 分析特征内部数据分布与分散状况

3.3 分析特征内部数据分布与分散状况 3.3.1 绘制直方图 bar()3.3.2 绘制饼图 pie()3.3.3 绘制箱线图 boxplot()3.3.4 任务实现1、绘制国民生产总值构成分布直方图2、绘制国民生产总值构成分布饼图3、绘制国民生产总值分散情况箱线图 小结 3.3.1 绘制直方图 bar() 直方图&#x…

Vue源码解析

【尚硅谷】Vue源码解析之虚拟DOM和diff算法 【Vue源码】图解 diff算法 与 虚拟DOM-snabbdom-最小量更新原理解析-手写源码-updateChildren] 文章目录 2. snabbdom 简介 及 准备工作2.1 简介2.2 搭建初始环境1. 安装snabbdom2. 安装webpack5并配置3. 复制官方demo Example 3. …

IJCAI 2023 | 如何从离散时间事件序列中学习因果结构?

本文分享一篇我们在IJCAI 2023的最新工作&#xff0c;文章分析了在离散时间事件序列上存在的瞬时效应问题&#xff0c;提出了一种利用瞬时效应的结构霍克斯模型&#xff0c;且在理论上证明了事件序列上的瞬时因果关系同样是可识别的。 相关论文&#xff1a; Jie Qiao et al. “…

基于SpringBoot的家庭记账管理系统的设计与实现

摘 要 随着社会的发展&#xff0c;社会的方方面面都在利用信息化时代的优势。互联网的优势和普及使得各种系统的开发成为必需。 本文以实际运用为开发背景&#xff0c;运用软件工程原理和开发方法&#xff0c;它主要是采用java语言技术和mysql数据库来完成对系统的设计。整个…

数据结构之线性表

1.线性表的定义 线性表是由n(n≥0)个类型相同的数据元素组成的有限 序列&#xff0c;记作:L &#x1d44e;0, &#x1d44e;1, ⋯ , &#x1d44e;&#x1d456; , ⋯ , &#x1d44e;&#x1d45b;−1 2 线性表的顺序存储结构实现 线性表的顺序存储结构称为顺序表&#xff08;…

2023年前端面试汇总-HTML

1. src和href的区别 src和href都是用来引用外部的资源&#xff0c;它们的区别如下&#xff1a; src表示对资源的引用&#xff0c;它指向的内容会嵌入到当前标签所在的位置。src会将其指向的资源下载并应用到文档内&#xff0c;如请求js脚本。当浏览器解析到该元素时&#xff…

HyperLogLog数据结构

基数计数(cardinality counting) 通常用来统计一个集合中不重复的元素个数&#xff0c;例如统计某个网站的UV&#xff0c;或者用户搜索网站的关键词数量。数据分析、网络监控及数据库优化等领域都会涉及到基数计数的需求。 要实现基数计数&#xff0c;最简单的做法是记录集合中…

34岁出来面试,还被拒绝有多惨?

我强烈建议大家定期去参加一下外面的面试&#xff0c;尤其是BAT大厂的面试&#xff0c;不要一直闷在公司里&#xff0c;不然你很容易被这个世界遗弃。 前言 昨天&#xff0c;我们小组长奉命去面了一个34岁的测试员。 去了大概半个多小时吧&#xff0c;回来后&#xff0c;他的…

图数据库(二):Java操作图数据库

在上篇文章中&#xff0c;我们介绍了什么是Neo4j&#xff0c;什么是Cypher以及Neo4j的使用&#xff0c;今天我们学习一下如何使用Java操作Neo4j图数据库。 Cypher查询 在使用Java操作Neo4j之前&#xff0c;我们先了解一点&#xff0c;Cypher语句简单查询。 本文使用的是Neo4j…

Flutter的状态管理之Provider

Provider简介 Flutter Provider是Flutter中一个非常流行的状态管理库&#xff0c;它可以帮助开发者更加方便地管理应用程序中的状态。Provider提供了一种简单的方式来共享和管理应用程序中的数据&#xff0c;并且可以根据数据的变化来自动更新UI界面。 Provider的核心思想是将…

网络协议——什么是RIP协议?工作原理是什么?

作者&#xff1a;Insist-- 个人主页&#xff1a;insist--个人主页 作者会持续更新网络知识和python基础知识&#xff0c;期待你的关注 目录 一、什么是RIP协议&#xff1f; 二、为什么要使用RIP&#xff1f; 三、RIP用在哪里&#xff1f; 四、RIP协议的工作原理 五、总结 …

Redis安装布隆过滤器

目录 1 什么是布隆过滤器1.1 布隆过滤器的原理1.2 布隆过滤器缺点 2 插件形式安装2.1 下载布隆过滤器插件 3 docker方式单机安装4 Redis集群部署安装4.1 创建目录4.2 redis配置文件4.3 配置docker-compose.yml文件4.4 启动布隆过滤器集群4.5 配置集群4.6 布隆过滤器常用命令4.7…

如何将simulink中的元件(光伏板)导入到plecs中使用

simulink中有一些元件在plecs中是没有的&#xff0c;如果想要直接使用simulink的库&#xff0c;可以这样操作&#xff1a; 1 新建mdl文件&#xff08;simulink的文件类型&#xff09;&#xff0c;并在该文件中搭建好想要的模型、元件&#xff08;只放想要导出的元件就可以了&…

商城检索 DSL

模糊匹配过滤&#xff08;按照属性、分类、品牌、价格区间、库存&#xff09;排序分页高亮聚合分析 一. 搜索关键字 检索字段&#xff1a;商品sku标题 “skuTitle” : “华为 HUAWEI Mate 30 Pro 亮黑色 8GB256GB麒麟990旗舰芯片OLED环幕屏双4000万徕卡电影四摄4G全网通手机”…

基于Java+SpringBoot+Vue前后端分离考试学习一体机设计与实现(视频讲解)

博主介绍&#xff1a;✌全网粉丝3W&#xff0c;全栈开发工程师&#xff0c;从事多年软件开发&#xff0c;在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战&#xff0c;博主也曾写过优秀论文&#xff0c;查重率极低&#xff0c;在这方面有丰富的经验…