awk 截取部分字符串_linux三剑客-awk

经常操作日志的小伙伴们对awk命令肯定不陌生,awk工具给我们分析日志提供了很便捷的操作,帮助我们完成统计和分析日志,也有很多小伙伴不会用到awk。awk作为一个强大的工具,对于我们工作能力和工作效率的提升,都有很多帮助,下面就让我们来领略一下awk的强大吧!

1.awk简介

awk适合文本处理和报表生成,在linux系统日常处理工作中,发挥了重要的作用,awk是三剑客的老大,利刃出销,必将不凡。

2.awk介绍

例如:awk '{print $0}' /etc/passwd

5cb7e624ad1cfabe0e89e9c7b497ef47.png

awk命令简单使用

解释:我们执行完上述命令之后,/etc/passwd文件的内容出现在眼前了。

在调用awk时,我们指定/etc/passwd为输入文件。执行awk时,会依次对/etc/passwd中的每一行执行print命令。所有输出都发送到stdout,所得到的结果和cat /etc/passwd相同。

再次强调:awk对输入文件中的每一行都执行这个脚本。

7feb16d5cbdcf0d6e142d0a64becc7de.png

简单说明

例如:awk -F ":" '{print $1}' /etc/passwd

8a64c9cc25ffbfaac8df846664797012.png

例如:awk -F ":" '{print $1 $3}' /etc/passwd

d116dbdb0b7f1627b3fa7064b6947643.png

例如:awk -F ":" '{print $1 " " $3}' /etc/passwd

9003985368283277ff3fb1d57e50e116.png

例如:awk -F ":" '{print "username:"$1 "uid:"$3}' /etc/passwd

ae8d0a4773ea92b195bd9788e6280b73.png

3.BEGIN和END模块

对于每个输入行,awk都会执行每个脚本代码块一次。然而,在很多情况下,可能需要在awk开始输入文件中的文本之前执行初始化代码。对于这种情况,awk允许您定义一个BEGIN块。awk在开始处理输入文件之前会执行BEGIN块,所以它是初始化FS(字段分隔符)变量、打印页眉或初始化其他在程序中以后会引用的全局变量的最佳位置。

awk还提供了END模块。awk在处理了输入文件中的所有行之后执行这个块。通常,END块用于执行最终计算或打印应该出现在输出流结尾的摘要信息。

4.运算符

ed5944e33d4a8c1f6aacf79c8a69a3fd.png

awk运算符

例如:赋值运算符

awk 'BEGIN{a=5;a+=5;print a}'

c1980e5295c5f39f35ba98131e80ad66.png

赋值运算符示例

例如:逻辑运算符

awk 'BEGIN{a=1;b=2;print(a>2&&b>1,a=1||b>1)}'

24cfa4a6227f940f2442358e1a45c472.png

逻辑运算符示例

例如:正则运算符

awk 'BEGIN{a="100testaaa"; if(a~/100/){print "ok"}}'

214758bc236ff3b489975793b0b49f3b.png

例如:关系运算符

说明:>

awk 'BEGIN{a="11";if(a>=9){print "ok"}}'

awk 'BEGIN{a=11;if(a>=9){print "ok"}}'

awk 'BEGIN{a;if(a>=b){print "ok"}}'

1f04ebdaf6642659e6567fcdba7bf8d2.png

关系运算符示例

例如:算术运算符

说明:所有用作算术运算符进行操作,操作数自动转为数值,所有非数值都变为0。

awk 'BEGIN{a="b";print a++, ++a}'

awk 'BEGIN{a="20b4";print a++, ++a}'

awk 'BEGIN{a="b";print a=="b"?"ok":"err"}'

awk 'BEGIN{a="b";print a=="c"?"ok":"err"}'

f04b8716dc35625a284633427b2e9093.png

5.awk内置变量

023a57278b944efe8f268aeb8fe12d99.png

awk内置变量

例如:字段分隔符FS

FS=""一个或多个Tab分隔

awk 'BEGIN{FS="+"}{print $1,$2,$3}' tab.txt

7e072e901e34874fffb2973e6c806f99.png

字段分隔符示例

FS="[[:space:]+]"一个或多个空白格

29c1528d1c44bca53e3c51df9fd8d310.png

空白格示例

FS="["":]+"以一个或多个空格或:分隔

975cf8bcc09cf9e5bda9310a246f75ab.png

空白格示例

字段数量NF

dd83901ecaa5c2154c165d1dfb2ddb60.png

字段数量示例

记录数量NR

7a317d2d15fe229ca42ef27046e86a89.png

记录数量示例

RS记录分隔符变量

将FS设置成""告诉awk每个字段都占据一行。通过将RS设置成"",还会告诉awk每个地址记录都由空白行分隔。

b4125d79cea577ec14009e23b120afb2.png
609c094885eb425033c459658dfa2ef7.png

记录分隔符变量示例

OFS输出字段分隔符

3398948721b28c47b71ded38037d1a3e.png

输出字段分隔符示例

ORS输出记录分隔符

184e45896609e6f5e4e72a90bfd28650.png

输出记录分隔符示例

6.awk正则

4041c8e76081a65460da0634834f7953.png

正则示例

比如:规则表达式

awk '/REG/{action}' file,/REG/为正则表达式,可以将$0中,满足条件的记录送入到:action进行处理。

3e4c8496e2fcb7edcaa569e050cb5ad5.png

规则表达式示例

118a08dc04e9ede0ed3d690fe9ba72f9.png

规则表达式示例

比如:布尔表达式

awk '布尔表达式{action}' file仅当对前面的布尔表达式求值为真时,awk才执行代码块。

5a4f1ae443dc81ef3ea7a41d1cd3fdfd.png

布尔表达式示例

7.awk的if、循环和数组

比如:条件语句

8b3cd1bf845d2da533b556210a7e2d0b.png

条件语句示例

使用if语句还可以将代码:

dabdf88602cd2fa13fd997f529bd154a.png

转换为:

e38e678089a2c1eebf4edad248ab9c73.png

比如:循环结构

awk还有"do...while"循环,它在代码块结尾处对条件求值,而不像标准的while循环那样在开始处求值。

fe500299f5d3171353690d0ddd04f7e9.png

循环结构示例

和一般的while循环不同,由于在代码块之后对条件求值,"do...while"循环永远都至少执行一次。

比如:for循环

awk允许创建for循环,它就像while循环。

7770c606eab98a5be9d1ef0105b9f414.png

for循环示例

7e65cf37a01208787d35033a0d6da70d.png

for简短示例

上面代码打印:

54ba3c9c0ea58d619941532a032076ef.png

打印结果

比如:break和continue

awk提供了break和continue语句。使用这些语句可以更好的控制awk的循环结果。

f24ed30a63b9c14ad2ef989ee4bfbfc7.png

死循环示例

1e7152e93e6b8472e8c701598cc0edd4.png

break示例

break语句用于"逃出"最深层的循环。"break"使循环立即终止,并继续执行循环代码块后面的语句。

continue语句补充了break。

ca7e324e4609f09c4889a333597e5ea5.png

continue中使用break示例

这段代码打印"iteration1"到"iteration21","iteration4"除外。如果迭代等于4,则增加x并调用continue语句,该语句立即使awk开始执行下一个循环迭代,而不执行代码块的其余部分。如同break一样,continue语句适合各种awk迭代循环。在for循环主体中使用时,continue将使循环控制变量自动增加。如下等价循环:

79bf4d8601b111719e5fc648b6c14a75.png

在while循环中时,在调用continue之前没必要增加x,因为for循环会自动增加x。

比如:数组

awk中的数组都是关联数组,数字索引也会转变为字符串索引

791cce6b2385586d6fbc89e747b722d8.png

for...in输出,因为数组是关联数组,默认是无序的。所以通过for...in得到无序的数组。如果需要得到有序数组,需要通过下标获得。

比如:用awk中查看服务器连接状态并汇总

dea471f5aa7b626556399a5d1228c163.png

比如:统计web日志访问流量,要求输出访问次数,请求页面或图片,每个请求的总大小,总访问流量的大小汇总。

26b685658a60ac8719e4b517b095eaa0.png

8.awk常用字符串函数

613a63eea463dd384d60b80ef03d8aed.png
c55861ec353ac2ae6a1facd6e0b153a6.png

比如:替换

a2c8a2139865a6de6e3e1a5d37500b07.png

比如:查找

db74e795771e00d8a8804fa1dee5e813.png

比如:匹配查找

aa46a75d70b68cc905c35824559878ad.png

比如:截取

f5934cfa60ed706f65eb2c5a77ae5a6f.png

比如:分割

a03c183a3cf2099f1e640d25ab222b31.png

希望对大家有多多帮助,如果大家有什么不懂的知识点,可以在评论区留言,我会给大家一一讲解!

表情包
插入表情
评论将由博主筛选后显示,对所有人可见 | 还能输入1000个字符
相关推荐
©️2020 CSDN 皮肤主题: 深蓝海洋 设计师:CSDN官方博客 返回首页