awk 截取部分字符串_linux三剑客-awk
经常操作日志的小伙伴们对awk命令肯定不陌生,awk工具给我们分析日志提供了很便捷的操作,帮助我们完成统计和分析日志,也有很多小伙伴不会用到awk。awk作为一个强大的工具,对于我们工作能力和工作效率的提升,都有很多帮助,下面就让我们来领略一下awk的强大吧!
1.awk简介
awk适合文本处理和报表生成,在linux系统日常处理工作中,发挥了重要的作用,awk是三剑客的老大,利刃出销,必将不凡。
2.awk介绍
例如:awk '{print $0}' /etc/passwd

awk命令简单使用
解释:我们执行完上述命令之后,/etc/passwd文件的内容出现在眼前了。
在调用awk时,我们指定/etc/passwd为输入文件。执行awk时,会依次对/etc/passwd中的每一行执行print命令。所有输出都发送到stdout,所得到的结果和cat /etc/passwd相同。
再次强调:awk对输入文件中的每一行都执行这个脚本。

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

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

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

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

3.BEGIN和END模块
对于每个输入行,awk都会执行每个脚本代码块一次。然而,在很多情况下,可能需要在awk开始输入文件中的文本之前执行初始化代码。对于这种情况,awk允许您定义一个BEGIN块。awk在开始处理输入文件之前会执行BEGIN块,所以它是初始化FS(字段分隔符)变量、打印页眉或初始化其他在程序中以后会引用的全局变量的最佳位置。
awk还提供了END模块。awk在处理了输入文件中的所有行之后执行这个块。通常,END块用于执行最终计算或打印应该出现在输出流结尾的摘要信息。
4.运算符

awk运算符
例如:赋值运算符
awk 'BEGIN{a=5;a+=5;print a}'

赋值运算符示例
例如:逻辑运算符
awk 'BEGIN{a=1;b=2;print(a>2&&b>1,a=1||b>1)}'

逻辑运算符示例
例如:正则运算符
awk 'BEGIN{a="100testaaa"; if(a~/100/){print "ok"}}'

例如:关系运算符
说明:>
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"}}'

关系运算符示例
例如:算术运算符
说明:所有用作算术运算符进行操作,操作数自动转为数值,所有非数值都变为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"}'

5.awk内置变量

awk内置变量
例如:字段分隔符FS
FS=""一个或多个Tab分隔
awk 'BEGIN{FS="+"}{print $1,$2,$3}' tab.txt

字段分隔符示例
FS="[[:space:]+]"一个或多个空白格

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

空白格示例
字段数量NF

字段数量示例
记录数量NR

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


记录分隔符变量示例
OFS输出字段分隔符

输出字段分隔符示例
ORS输出记录分隔符

输出记录分隔符示例
6.awk正则

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

规则表达式示例

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

布尔表达式示例
7.awk的if、循环和数组
比如:条件语句

条件语句示例
使用if语句还可以将代码:

转换为:

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

循环结构示例
和一般的while循环不同,由于在代码块之后对条件求值,"do...while"循环永远都至少执行一次。
比如:for循环
awk允许创建for循环,它就像while循环。

for循环示例

for简短示例
上面代码打印:

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

死循环示例

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

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

在while循环中时,在调用continue之前没必要增加x,因为for循环会自动增加x。
比如:数组
awk中的数组都是关联数组,数字索引也会转变为字符串索引

for...in输出,因为数组是关联数组,默认是无序的。所以通过for...in得到无序的数组。如果需要得到有序数组,需要通过下标获得。
比如:用awk中查看服务器连接状态并汇总

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

8.awk常用字符串函数


比如:替换

比如:查找

比如:匹配查找

比如:截取

比如:分割

希望对大家有多多帮助,如果大家有什么不懂的知识点,可以在评论区留言,我会给大家一一讲解!
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
