hi,大家好,小姐姐味觉最有用的系列已经结束了。记得转发点赞哦。最有用的系列:《Linux生产环境上,最常用的一套“vim“技巧》《Linux生产环境上,最常用的一套“Sed“技巧》《Linux生产环境上,最常用的一套“AWK“技巧》《"Sed" 高级功能:我这小脑瓜都快绕晕了》敢用自己名字做软件名的人,自信心很强。比如殷语什么的。awk的名字来源于其三位创始人姓氏的首字母,他们都是80多岁的爷爷。当然也有四种的组合:流行的GoF设计模式。但是对于我这样的游戏爱好者来说,想到的却是三位一体,实在是太让人失望了。长得像C,为什么这么有名,除了功能强大,让我们觉得字母a比较高级。awk比sed更简单,它更像是一种编程语言。在某一列下面,这几行代码的效果基本相同:打印文件中的第一列。#JavaSystem.out.println(aStr.split("")[0]);#Pythonprint(aString.split("")[0])#cutcommandcut-d""-f1file#awkcommandawk'{print$1}'file这可能是awk最常用的功能了:打印文件中的某一列。它智能地划分你的数据,无论是空格还是TAB,大概率就是你想要的。对于csv文件,分隔符是,。AWK使用-F参数来指定。以下代码打印csv文件中的第1列和第2列。awk-F","'{print$1,$2}'file从这里,我们可以看到基本的awk命令的组成部分。一般的开发语言,数组下标都是0开头,而awk的$列是1开头,0指的是原始字符串。网络状态统计本节使用awk统计netstat命令的一些网络状态,下面我们就来了解一下awk语言的基本要素。netstat的输出类似于:其中,第6列表示网络连接的网络状态。我们先下awk命令看看统计结果。网络统计-ant|awk'\BEGIN{print"State","Count"}\/^tcp/\{rt[$6]++}\END{for(iinrt){printi,rt[i]}}'输出resultis:StateCountLAST_ACK1LISTEN64CLOSE_WAIT43ESTABLISHED719SYN_SENT5TIME_WAIT146下图将结合上面的命令详细使用,希望大家能理解awk的精髓。乍一看,这是一个吓人的命令,其实很简单。awk和我们平时的程序不一样,它分为四个部分。1.BEGIN的开头是可选的。用来设置一些参数,输出一些header,定义一些变量等。上面的命令只打印了一行信息。2.END结束部分,可选。用来计算一些汇总逻辑,或者输出这些内容。上面的命令,使用一个简单的for循环,输出数组rt的内容。3.Pattern匹配部分仍然是可选的。用于匹配一些需要处理的行。上面的命令只匹配以tcp开头的行,其他的不做处理。4.动作模块。主体逻辑体、按行处理、统计打印一应俱全。注意第1点,awk的主程序部分是用单引号'括起来的,不是双引号。2、awk的列开头的索引是0,不是1。例子下面通过几个简单的例子来看awk的功能。1、输出Recv-Q不为0的记录awk'$2>0{print}'2.外网连接数,按照ip分组netstat-ant|awk'/^tcp/{print$4}'|awk-F:'!/^:/{print$1}'|排序|uniq-c3,打印RSS物理内存使用情况top-b-n1|awk'NR>7{rss+=$6}END{printrss}4,过滤(删除)空行awk'NF'file5,打印奇数行awk'a=!a'file6,输出行awk'END{printNR}'file这些命令需要了解awk的一些内部变量,接下来就来介绍一下。内置变量FS下面的两个命令是等价的。awk-F':''{print$3}'fileawk'BEGIN{FS=":"}{print$3}'fileBEGIN块中的FS是一个内部变量,可以直接指定也可以输出。如果你的文件是useful、delimited和useful:delimited,FS甚至可以指定多个分隔符同时工作。FS="[,:|]"OtherOFS指定输出内容的分隔符。当列数很大时,简化操作。类似命令:awk-F':''{print$1,"-",$2,"-",$4}'fileawk'BEGIN{FS=":";OFS="-"}{print$1,$2,$4}'文件NF列数。非常有用,比如过滤一些列数不符合条件的内容。awk-F,'{if(NF==3){print}}'fileNR行号,例如下面两条命令是等价的。cat-nfileawk'{printNR,$0}'fileRSrecorddelimiterORS指定记录输出分隔符FILENAME当前处理的文件名,一次处理多个文件时很有用编程语言特点数学运算从上面的代码可以可以看到awk可以做一些简单的操作。它的语言简洁,不需要显式定义变量类型。比如上面的rt[$6]++已经默认定义了一个hash(数组?)叫rt,里面的key是网络状态,value可以计算(+-*/%)。包含一些内置的数学运算(有限)intlogsqrtexpsincosatan2randsrand字符串操作与其他语言类似,awk也有许多内置的字符串操作函数。它旨在处理字符串,因此必须功能强大。length(str)#获取字符串长度split(input-string,output-array,separator)substr(input-string,location,length)语言特点awk是一门小型编程语言,看看它的基本语法,如果需要复杂的A一点逻辑,请自行理解,包括一些时间处理函数:#logicif(x=a){}if(x=a){}else{}while(x=a){break;continue;}do{}while(x=a)for(;;){}#arrayarr[key]=valuefor(keyinarr){arr[key]}deletearr[key]asort(arr)#简单排序据说awk可以做所有的文本操作。因为它本身就是一种语言。完了用awk写了复杂的日志处理和统计程序。虽然比写sed舒服多了,但还是煎熬。另外,nawk和gawk各个版本之间存在差异,所以当业务复杂度增加时,习惯性转向python,更简单,工具更齐全。awk处理一些简单的文本是极其方便的。最常用的是打印某一列,包括一些格式化的输出。对于awk,简单的要熟悉,复杂的要熟悉。毕竟有些大牛就喜欢写这种脚本。更多精彩文章。《微服务不是全部,只是特定领域的子集》《“分库分表" ?选型和流程要慎重,否则会失控》监控组件那么多,总有一款适合你《Kafka消息系统基础知识索引》《使用Netty,我们到底在开发些什么?》Linux五件套之类的。《Linux之《荒岛余生》(1)准备》《Linux之《荒岛余生》(2)CPU》《Linux之《荒岛余生》(3)内存》《Linux之《荒岛余生》(4)I/O》《Linux之《荒岛余生》(5)网络》
