awk 分隔符_linux三剑客-awk

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

1.awk简介

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

2.awk介绍

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

d346114ef4af3589c3d0b7a2587baa85.png

awk命令简单使用

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

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

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

00bd6df3bc037913ba9be3d330c1d1dd.png

简单说明

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

55a39a94f4e4544ce25eb2f49cee7446.png

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

d2435ab163f69a15fbd56927b3d71777.png

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

71e09f23bfb5acb53226db2f7ec5577c.png

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

6418c9ebd49d1f48cc90ec03285b8f93.png

3.BEGIN和END模块

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

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

4.运算符

71a55c0a0fe1ad4f08ada3de41b9b3b8.png

awk运算符

例如:赋值运算符

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

d3a9936870fb40c9941e706f30e67ba7.png

赋值运算符示例

例如:逻辑运算符

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

baa317d4a4b01336acb448965f77ce47.png

逻辑运算符示例

例如:正则运算符

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

3e4249754b81351b489f590bc6486582.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"}}'

451c042d9abb4bd21dbec5a4899027f1.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"}'

c007ba951cd2f353b1a99119ca8403a7.png

5.awk内置变量

d61c6c25ce8ab804ea45a04b19b24e5f.png

awk内置变量

例如:字段分隔符FS

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

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

097e46e309d41612ec4bf6dcfbb7da82.png

字段分隔符示例

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

d193b44ca77d57b654bbf12ecde85a3e.png

空白格示例

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

1486e505d87ef89a54d2890f09bab1e5.png

空白格示例

字段数量NF

c725c182587448e5282e939b82e9e366.png

字段数量示例

记录数量NR

1f5ed870dbd09faa0c39d72871086fb7.png

记录数量示例

RS记录分隔符变量

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

0e59750d00a6cb19b08a7eeea38af49a.png
611d6e018eb60d17bdf2c5b6b07b79bf.png

记录分隔符变量示例

OFS输出字段分隔符

c905ea794bbcd13352bf0219f953b625.png

输出字段分隔符示例

ORS输出记录分隔符

aa2aad2f9eb2b42e8e5f6498dccff78e.png

输出记录分隔符示例

6.awk正则

761c9dbb095e6de5edfc9f455d6c53e2.png

正则示例

比如:规则表达式

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

1ee4ed52aca84f9acd479fa0e6cf7bcb.png

规则表达式示例

281d0f23097f39b8ca2271cf3589d291.png

规则表达式示例

比如:布尔表达式

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

2e31cd7723bfcdd82f9f2dfa35d0703a.png

布尔表达式示例

7.awk的if、循环和数组

比如:条件语句

a6b3e4be740d243029acb07fbd14bb0b.png

条件语句示例

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

af8b42872a6a1ca9fd6c11fa0710443c.png

转换为:

59d79aed9506cb63dba964dfdd2f06f4.png

比如:循环结构

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

072e606982a5648ea002d555362b373d.png

循环结构示例

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

比如:for循环

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

70cc160d67571c7b01fd1ffce450610a.png

for循环示例

0255285aa85f70b4d091b9641587191d.png

for简短示例

上面代码打印:

ac11945f06ac1828cf9e2b38975493eb.png

打印结果

比如:break和continue

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

1c4fa8ad381d7732c660d332fb8954c0.png

死循环示例

1a5dc6d803aa4c34c12e4c8ecdd19455.png

break示例

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

continue语句补充了break。

6b67da51c2a00253a0f2a2e4664c5f67.png

continue中使用break示例

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

5d35e30009cba275b7c220744494c6f1.png

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

比如:数组

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

35bb3df2ce032348391b564caac3de44.png

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

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

19794d22878104bba35a9ce9dca845a1.png

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

e17d59a1d46e02c5ab48a1519c974657.png

8.awk常用字符串函数

160932793d5ee8341b621bcd7991d770.png
f84a40c1f4749e6a83104c02d7438c63.png

比如:替换

ed782799c1a0fcf4c2812f5a661ad792.png

比如:查找

7d51e41c92d96e7e430413aac02cdfbe.png

比如:匹配查找

a6f0fef526a9b98e86eaa6cfa546f312.png

比如:截取

6d22f17469b34d1d3d212f0ca7f9b402.png

比如:分割

318d20076f2f1c299219458dd10d7070.png

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值