[转帖]Shell三剑客之awk
目录
awk简述
在 Linux/UNIX 系统中,awk 是一个功能强大的编辑工具,逐行读取输入文本,默认以空格或tab键作为分隔符作为分隔,并按模式或者条件执行编辑命令。
AWK信息的读入也是逐行指定的匹配模式进行查找,对符合条件的内容进行格式化输出或者过滤处理,可以在无交互 的情况下实现相当复杂的文本操作,被广泛应用于 Shell 脚本,完成各种自动化配置任务。
awk的工作过程
第一步:执行BEGIN{action;… }语句块中的语句。
第二步:从文件或标准输入(stdin)读取一行,然后执行pattern{ action;… }语句块,它逐行扫描文件,从第一行到最后一行重复这个过程,直到文件全部被读取完毕。
第三步:当读至输入流末尾时,执行END{action;…}语句块。
BEGIN语句块在awk开始从输入流中读取行之前被执行,这是一个可选的语句块,比如变量初始化、打印输出表格的表头等语句通常可以写在BEGIN语句块中
END语句块在awk从输入流中读取完所有的行之后即被执行,比如打印所有行的分析结果这类信息汇总都是在END语句块中完成,它也是一个可选语句块。
pattern语句块中的通用命令是最重要的部分,也是可选的。如果没有提供pattern语句块,则默认执行{ print },即打印每一个读取到的行,awk读取的每一行都会执行该语句块。
awk的工作原理
sed命令常用于一整行的处理,而awk比较倾向于将一行分成多个“字段”然后再进行处理,且默认情况下字段的分隔符为空格或 tab 键。
awk 执行结果可以通过 print 的功能将字段数据打印显示
awk的基本格式及其内置变量
awk 选项 ‘模式或条件 {操作}’ 文件1 文件2…
-F “分隔符” 指明输入时用到的字段分隔符,默认的分隔符是若干个连续空白符
-v(小v) var=value 变量赋值
注意一定是单引号:‘模式或条件 {操作}’
{ }外指定条件,{ }内指定操作。
用逗号指定连续的行,用 || 指定不连续的行。&&表示”且“。
内建变量,不能用双引号括起来,不然系统会把它当成字符串。
内置变量
$0: 当前处理的行的整行内容
$n: 当前处理行的第n个字段(第n列)
NR: 当前处理的行的行号(序数)
NF: 当前处理的行的字段个数。$NF代表最后一个字段
FS: 列分割符。指定每行文本的字段分隔符,输入内容的分隔符,
默认为空格或制表位。与"-F"作用相同 用-F可以不加单引号 -F:,用FS必须用=""
OFS:输出内容的列分隔符
FILENAME:被处理的文件名
RS: 行分隔符。awk从文件中读取资料时,
将根据RS的定义把资料切割成许多条记录,而awk一次仅读入一条记录进行处理。预设值是"\n"

0和1放置{ }前,能够起到限制打印内容的作用(默认为"1"),如果为0,就不打印内容



getline
getline的工作过程
1、当getline左右无重定向符号(“<”)或者管道符号(“|”)时,awk首先读取的是第一行,而getline获取的是光标跳转至下一行的内容(也就是第二行)。
2、当getline左右有管道符号或重定向符时,getline则作用定向输入文件,由于文件是刚打开,并没有被awk读入一行,而只是getline读入,所以getline返回的是文件的第一行,而不是跳转至一行输入。
原因:getline运行之后awk会改变NF,NR,$0,FNR等内部变量,所以此时读取$0的行号不再为1,而是2。



把ls的输出传递给getline函数,line是变量 把ls的内容输出给变量,然后打印出结果,如果无内容,不做任何操作
文本内容匹配过滤打印

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

对字段进行处理打印

-v的用法:变量赋值

fs的是:然后使用-v给FS赋值=:,输入的时候FS是:,-v给OFS赋值输出的时候变量为+,然后打印第一列和第三列
条件判断打印



awk的三元表达式与精准筛选用法
awk的三元表达式继承了java的用法,格式与Java相似
格式:awk ‘(条件表达式)?(A表达式或者值):(B表达式或者值)’

awk的精准筛选:
$n(> < ==): 用于对比数值
$n~"字符串": 代表第n个字段包含某个字符串
$n!~"字符串": 代表第n个字段不包含某个字符串
$n=="字符串": 代表第n个字段为某个字符串
$n!="字符串": 代表第n个字段不为某个字符串
$NF: 代表最后一个字段
- 1
- 2
- 3
- 4
- 5
- 6


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

指定输出的分隔符
OFS:输出内容的列分隔符。
($n=$n用于激活,否则不生效,n必须存在)
- 1

awk结合数组运用
awk中定义数组打印:

awk中的数组形成遍历

面试题
监控内存脚本(当内存使用率>90%就报警)
Mem_total=$(free -m | grep -w Mem | awk '{print $2}')
Mem_used=$(free -m | grep -w Mem | awk '{print $3}')
a=\((</span><span class="token builtin class-name">echo</span> <span class="token string">"scale=2;(<span class="token variable">\)Mem_used/$Mem_total)*100"|bc)
Mem=</span><span class="token builtin class-name">echo</span> $a<span class="token operator">|</span><span class="token function">awk</span> -F. <span class="token string">'{print $1}'</span><span class="token variable">
if [ \(Mem</span> -gt <span class="token number">90</span> <span class="token punctuation">]</span>
<span class="token keyword">then</span>
<span class="token builtin class-name">echo</span> <span class="token string">"内存使用超过90%,请清理内存"</span>
<span class="token keyword">else</span>
<span class="token builtin class-name">echo</span> <span class="token string">"系统安全,请放心使用,内存使用情况:<span class="token variable">\)Mem%"
fi
监控CPU使用情况脚本
top -b -n 1 | awk 'NR==3{print}'| awk '{print "目前CPU的使用情况:"$2+$4}'
- 1
监控磁盘使用情况脚本(当磁盘使用率>90%就报警)
a=$(df -T | awk 'NR==2{print}' | awk '{print $4}')
b=$(df -T | awk 'NR==2{print}' | awk '{print \(5}'</span><span class="token variable">)</span></span>
<span class="token assign-left variable">c</span><span class="token operator">=</span><span class="token variable"><span class="token variable">\)(echo "scale=2;(\(a</span>/<span class="token variable">\)b)*100"|bc)
sum=</span><span class="token builtin class-name">echo</span> $c <span class="token operator">|</span><span class="token function">awk</span> -F. <span class="token string">'{print $1}'</span><span class="token variable">
if [ \(sum</span> -gt <span class="token number">90</span> <span class="token punctuation">]</span>
<span class="token keyword">then</span>
<span class="token builtin class-name">echo</span> <span class="token string">"磁盘使用超过90%,请清理磁盘"</span>
<span class="token keyword">else</span>
<span class="token builtin class-name">echo</span> <span class="token string">"系统安全,请放心使用,磁盘使用情况:<span class="token variable">\)sum%"
fi
[转帖]Shell三剑客之awk的更多相关文章
- shell 三剑客之 awk
awk 是shell 里的常用命令,非常强大!
- shell编程系列21--文本处理三剑客之awk中数组的用法及模拟生产环境数据统计
shell编程系列21--文本处理三剑客之awk中数组的用法及模拟生产环境数据统计 shell中的数组的用法: shell数组中的下标是从0开始的 array=("Allen" & ...
- shell编程系列20--文本处理三剑客之awk常用选项
shell编程系列20--文本处理三剑客之awk常用选项 awk选项总结 选项 解释 -v 参数传递 -f 指定脚本文件 -F 指定分隔符 -V 查看awk的版本号 [root@localhost s ...
- shell编程系列19--文本处理三剑客之awk中的字符串函数
shell编程系列19--文本处理三剑客之awk中的字符串函数 字符串函数对照表(上) 函数名 解释 函数返回值 length(str) 计算字符串长度 整数长度值 index(str1,str2) ...
- shell编程系列18--文本处理三剑客之awk动作中的条件及if/while/do while/for循环语句
shell编程系列18--文本处理三剑客之awk动作中的条件及if/while/do while/for循环语句条件语句 if(条件表达式) 动作1 else if(条件表达式) 动作2 else 动 ...
- shell编程系列17--文本处理三剑客之awk动作中的表达式用法
shell编程系列17--文本处理三剑客之awk动作中的表达式用法 awk动作表达式中的算数运算符 awk动作中的表达式用法总结: 运算符 含义 + 加 - 减 * 乘 / 除 % 模 ^或** 乘方 ...
- shell编程系列16--文本处理三剑客之awk模式匹配的两种方法
shell编程系列16--文本处理三剑客之awk模式匹配的两种方法 awk的工作模式 第一种模式匹配:RegExp 第二种模式匹配:关系运算匹配 用法格式对照表 语法格式 含义 RegExp 按正则表 ...
- shell编程系列15--文本处理三剑客之awk格式化输出printf
shell编程系列15--文本处理三剑客之awk格式化输出printf printf的格式说明符 格式符 含义 %s 打印字符串 %d 打印十进制数 %f 打印一个浮点数 %x 打印十六进制数 %o ...
- shell编程系列14--文本处理三剑客之awk的概述及常用方法总结
shell编程系列14--文本处理三剑客之awk的概述及常用方法总结 awk是一个文本处理工具,通常用于处理数据并生成结果报告 awk的命名是它的创始人 Alfred Aho.Peter Weinbe ...
- Linux系统Shell脚本第五章:shell数组、正则表达式及文件三剑客之AWK
目录 一.shell数组 1.数组分类 2.定义数组方法 二.正则表达式 1.元字符 2.表示次数 3.位置锚定 4.分组 5.扩展正则表达式 三.文本三剑客之AWK 1.awk 2.使用格式 3.处 ...
随机推荐
- java判断两个日期是否连续
使用java判断两个日期的天是否连续 import java.text.SimpleDateFormat; import java.util.Date; /** * @author lingkang ...
- RV1126 DSI 调试
一.基本信息 开发板:RV1126 linux版本:4.19.111 显示屏:HX070JGI50(7寸) 显示器分别率:1024 * 600 二.MIPI协议 连接示意图(图片来源,正点资料) MI ...
- Programming abstractions in C阅读笔记:p184-p195
<Programming Abstractions In C>学习第61天,p184-p195总结. 一.技术总结 1.mutual recursion 2.natural number ...
- GDAL从二进制数据流中构造数据集
目录 1. 概述 2. 实现 1. 概述 参看<从二进制数据流中构造GDAL可以读取的图像数据>这篇文章.这个问题的内涵在于,处理图像时都会将其读取成宽X高X波段的三维数组的内存Buffe ...
- Llama2-Chinese项目:2.2-大语言模型词表扩充
因为原生LLaMA对中文的支持很弱,一个中文汉子往往被切分成多个token,因此需要对其进行中文词表扩展.思路通常是在中文语料库上训练一个中文tokenizer模型,然后将中文tokenizer与 ...
- 云图说|华为云CodeArts Build,云端化的编译构建平台
阅识风云是华为云信息大咖,擅长将复杂信息多元化呈现,其出品的一张图(云图说).深入浅出的博文(云小课)或短视频(云视厅)总有一款能让您快速上手华为云.更多精彩内容请单击此处. 本文分享自华为云社区&l ...
- GaussDB(DWS)案例丨MERGE场景下语句不下推引起的性能瓶颈问题
本文分享自华为云社区<GaussDB(DWS)性能调优:MERGE场景下语句不下推引起的性能瓶颈问题案例>,作者:O泡果奶~. 1.[问题描述] 语句执行时间过长,且该语句performa ...
- KubeEdge在边缘计算领域的安全防护及洞察
摘要:着重介绍Kubeedge在安全防护方面的实践,并介绍OpenSSF在开源软件安全方面的计划与目标. 本文分享自华为云社区<KubeEdge在边缘计算领域的安全防护及洞察>,作者:华为 ...
- 火山引擎 DataLeap 构建Data Catalog系统的实践(三):关键技术与总结
更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 关键技术 构建一个好的Data Catalog系统,需要考虑的核心产品设计和技术设计有很多.篇幅所限,本文只概要介 ...
- IDEA画图神器 PlantUML
PlantUML 是一款开源的UML图绘制工具,支持通过文本来生成图形,使用起来非常高效.可以支持时序图.类图.对象图.活动图.思维导图等图形的绘制. 下面使用PlantUML来绘制一张流程图,可以实 ...