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

这篇具有很好参考价值的文章主要介绍了Shell脚本攻略:文本三剑客之awk。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、理论

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)内置变量

内置变量,不能用双引号括起来,不然系统会把它当成字符串。
Shell脚本攻略:文本三剑客之awk

表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)基本打印用法

① 基本打印

指定行号

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

打印行号和内容

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

打印第3行

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

打印第3行到第5行

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

打印第3行和第5行

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

奇偶行打印:

打印偶数

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

打印奇数

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

awk运算:

运算

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

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

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

先跳行,再打印(偶数)

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

(2)文件内容匹配过滤

与正则表达式配合使用:

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

(3)BEGIN打印模式

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

BEGIN END模式

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

-v

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

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

(4)BEIGIN模式指定

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

指定换行符

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

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

(5)awk的三元表达式

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

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

三元表达式(面试):

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

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

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

(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

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

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

小于等于10 uid

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

取反

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

(7)awk的分隔符用法

① RS 指定行分隔符:

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

② 指定输出的分隔符:

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

③ awk改变输出分隔符

精准筛选

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

逻辑且

Shell脚本攻略:文本三剑客之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条件:

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

4.awk数组与循环

 awk结合数组运用

awk中定义数组打印:

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

数组遍历

语法:

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

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

Awk结合数组去重

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

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

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

②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。

重定向:

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

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

getline 管道服 (赋值变量):

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

② 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)运行结果

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

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

(1)运行结果

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

3.CPU使用率

(1)运行结果

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

4.统计内存

(1)脚本截图

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

(2)运行结果

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

5.监控硬盘

(1)脚本截图

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

(2)运行结果

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

Shell脚本攻略:文本三剑客之awk文章来源地址https://www.toymoban.com/news/detail-474965.html

到了这里,关于Shell脚本攻略:文本三剑客之awk的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • linux文本三剑客

    过滤/查找 参数 用法 作用 -i grep -i STRING xxx.txt 从xxx.txt文件查找不区分大小写STRING -w grep -w STRING xxx.txt 精确匹配STRING -e grep -e STRING1 -e STRING2 xxx.txt 查找多个STRING行 -n grep -n STRING xxx.txt 查看STRING 在第几行 -v grep -v STRING xxx.txt 输出不包含STRING的行 -r grep -r STRING DIR/ 查找DIR目录下哪

    2024年02月11日
    浏览(42)
  • 文本三剑客之 awk

    Linux/UNIX 系统中,awk 是一个功能强大的编辑工具。逐行读取输入文本 以空格作为分割符,多个空格他会自动压缩成一个空格 AWK信息的读入也是逐行指定的匹配模式进行查找,对符合条件的内容进行格式化输出或者过滤处理. 1按照命令找指定的行  2.找到的行 打印,操作 awk

    2024年02月08日
    浏览(42)
  • linux文本三剑客详解

    awk、grep、sed是linux操作文本的三大利器,合称文本三剑客。 特点: grep——单纯的查找或匹配文本。 sed——编辑匹配到的文本。 awk——格式化文本,对文本进行较复杂格式处理。 首先了解一下正则表达式: 匹配字符  配置次数  位置锚定:定位出现的位置   实例介绍:

    2024年04月16日
    浏览(47)
  • Linux文本三剑客---awk

    Linux文本三剑客之一(grep,sed,awk),功能最强大的文本工具。 逐行读取输入的文本内容,默认以空格和tab键作为分隔符。但是多个空格或者tab键的空格,会自动压缩成一个,然后按照指定的模式和条件执行编辑命令 可以在免交互的情况下,实现复杂的文本操作。完成自动化配

    2024年02月07日
    浏览(48)
  • 文本三剑客之~~~sed命令

    sed是一种流编辑器,流编辑器会在编辑器处理数据之前基于预先提供的一组规则来编辑数据流。 sed编辑器可以根据命令来处理数据流中的数据,这些命令要么从命令行中输入,要么存储在一个命令文本文件中。 包括读取,执行和显示三个过程 读取:sed从输入流(文件,管道

    2024年02月05日
    浏览(41)
  • Linux:文本三剑客之awk

    awk:是一种 处理文本文件的语言 ,是一个强大的 文本分析工具 。 awk: 逐行读取文本 ,默认以 空格 或 tab键 为分隔符 进行分隔 ,将分隔所得的 各个字段 保存到 内建变量 中,并按模式或者条件执行编辑命令。 1、sed命令常用于一整行的处理,而awk比较 倾向于将一行分成

    2024年02月05日
    浏览(57)
  • 文本三剑客&正则表达式2

    主要是对文件内容按照行的方式进行增删改查 工作流程 sed的工作流程主要包括** 读取、执行和显示 **三个过程 读取 sed从 输入流 (文件、管道、标准输入) 中读取一行内容并存储到临时的缓冲区中(又称模式空间,pattern space ) 执行 默认情况下,所有的sed命令都在模式空间中

    2024年02月05日
    浏览(47)
  • 文本三剑客之sed编辑器

    Sed是一个强大的文本处理工具,其名称是Stream Editor(流编辑器)的缩写。它被设计用于根据用户定义的规则对文本进行逐行处理和转换。 Sed通过从输入流中逐行读取文本,并根据用户指定的命令来对每一行进行处理 sed的工作原理是 逐行读取 输入文本,并根据用户 指定的命

    2024年02月12日
    浏览(46)
  • 正则表达式和文本三剑客题型练习

    ​ 1、显示/etc/passwd文件中以bash结尾的行; 解释:使用 grep 工具来搜索文件 /etc/passwd 中匹配模式 \\\'bash$\\\' 的行。 bash$ 是一个正则表达式,其中 $ 表示行结尾。因此, \\\'bash$\\\' 匹配以 bash 结尾的行。 运行结果: ​ 2、找出\\\"netstat  -tan”命令的结果中,以‘LISTEN’后跟0或多个空白字

    2024年02月06日
    浏览(44)
  • 快速上手Linux核心命令(五):文本处理三剑客

    目录 前言 正则表达式 第一剑客 grep 第二剑客 sed 第三 剑客 awk 小结 上一篇中已经预告,我们这篇主要说Linux文本处理 三剑客 。他们分别是 grep 、 sed 、 awk 。既然能被业界称为三剑客,可见其在Linux命令中占有举足轻重得地位。所以呢,这里也专门写一篇文章说一说其用法。

    2023年04月25日
    浏览(63)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包