hi,你们好,小姐姐味道最有用系列完结。记得多多转发,点赞哦。python
最有用系列:编程
《Linux生产环境上,最经常使用的一套“vim“技巧》vim
《Linux生产环境上,最经常使用的一套“Sed“技巧》设计模式
《Linux生产环境上,最经常使用的一套“AWK“技巧》数组
敢用本身的名字作软件名字的,都有很是强大的自信。好比,垠语言什么的。网络
awk
的命名得自于它的三个创始人姓别的首字母,都是80来岁
的老爷爷了。固然也有四我的的组合:流行的GoF设计模式。但对于我这游戏爱好者来讲,想到的居然是三位一体,果真是不争气啊。tcp
它长的很像C,为何这么有名,除了它强大的功能,咱们姑且认为a
这个字母比较靠前吧。awk
比sed
简单,它更像一门编程语言。编程语言
下面,这几行代码的效果基本是相同的:打印文件中的第一列。函数
#Java
System.out.println(aStr.split(" ")[0]);
#Python
print(aString.split(" ")[0])
#cut 命令
cut -d " " -f1 file
#awk命令
awk '{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命令,看一下统计结果。
netstat -ant |
awk ' \ BEGIN{print "State","Count" } \ /^tcp/ \ { rt[$6]++ } \ END{ for(i in rt){print i,rt[i]} }'
复制代码
输出结果为:
State Count
LAST_ACK 1
LISTEN 64
CLOSE_WAIT 43
ESTABLISHED 719
SYN_SENT 5
TIME_WAIT 146
复制代码
下面这张图会配合以上命令详细说明,但愿你能了解awk的精髓。
乍一看,好吓人的命令,可是很简单。awk和咱们一般的程序不太同样,它分为四个部分。
一、BEGIN 开头部分,可选的。用来设置一些参数,输出一些表头,定义一些变量等。上面的命令仅打印了一行信息而已。
二、END 结尾部分,可选的。用来计算一些汇总逻辑,或者输出这些内容。上面的命令,使用简单的for循环,输出了数组rt中的内容。
三、Pattern 匹配部分,依然可选。用来匹配一些须要处理的行。上面的命令,只匹配tcp开头的行,其余的不进入处理。
四、Action 模块。主要逻辑体,按行处理,统计打印,均可以。
注意点
一、awk的主程序部分使用单引号‘包围,而不能是双引号 二、awk的列开始的index是0,而不是1
咱们从几个简单的例子,来看下awk的做用。
一、输出Recv-Q不为0的记录
netstat -ant | awk '$2 > 0 {print}'
复制代码
二、外网链接数,根据ip分组
netstat -ant | awk '/^tcp/{print $4}' | awk -F: '!/^:/{print $1}' | sort | uniq -c
复制代码
三、打印RSS物理内存占用
top -b -n 1 | awk 'NR>7{rss+=$6}END{print rss} 复制代码
四、过滤(去掉)空白行
awk 'NF' file
复制代码
五、打印奇数行
awk 'a=!a' file
复制代码
六、输出行数
awk 'END{print NR}' file
复制代码
这些命令,是须要了解awk的一些内部变量的,接下来咱们来介绍。
下面的两个命令是等价的 。
awk -F ':' '{print $3}' file
awk 'BEGIN{FS=":"}{print $3}' file
复制代码
**BEGIN块中的FS
,就是内部变量,能够直接指定或者输出。**若是你的文件既有用,
分隔的,也有用:
分割的,FS甚至能够指定多个分隔符同时起做用。
FS="[,:|]"
复制代码
OFS 指定输出内容的分割符,列数很是多的时候,简化操做。类似命令:
awk -F ':' '{print $1,"-",$2,"-",$4}' file
awk 'BEGIN{FS=":";OFS="-"}{print $1,$2,$4}' file
复制代码
NF 列数。很是有用,好比,过滤一些列数不知足条件的内容。
awk -F, '{if(NF==3){print}}' file
复制代码
NR 行号,例如,下面两个命令是等价的。
cat -n file
awk '{print NR,$0}' file
复制代码
RS 记录分隔标志 ORS 指定记录输出的分隔标志
FILENAME 当前处理的文件名称,在一次性处理多个文件时很是有用
从上面的代码能够看出,awk能够作一些简单的运算。它的语言简洁,不须要显示的定义变量的类型。
好比上面的rt[$6]++
,就已经默认定义了一个叫作rt的hash(array?),里面的key是网络状态,而value是能够进行运算的(+-*/%)。
包含一些内置的数学运算(有限)
int
log
sqrt
exp
sin
cos
atan2
rand
srand
复制代码
相似其余语言,awk也内置了不少字符串操做函数。它原本就是处理字符串的,因此必须强大。
length(str) #获取字符串长度
split(input-string,output-array,separator)
substr(input-string, location, length)
复制代码
awk是个小型的编程语言,看它的基本语法,若是你须要复杂一点的逻辑,请自行深刻了解,包括一些时间处理函数:
# logic
if(x=a){}
if(x=a){}else{}
while(x=a){break;continue;}
do{}while(x=a)
for(;;){}
# array
arr[key] = value
for(key in arr){arr[key]}
delete arr[key]
asort(arr) #简单排序
复制代码
听说,awk能够胜任全部的文本操做。由于它自己就是一门语言啊。
曾经使用awk编写过复杂的日志处理和统计程序。虽然比写sed
舒畅了不少,但仍是备受煎熬。更加上如今有各类nawk,gawk版本之间的区别,因此业务复杂度一增加,就习惯性的转向更加简洁、工具更全的python。
awk处理一些简单的文本仍是极其方便的,最经常使用的仍是打印某一列之类的,包括一些格式化输出。对于awk,要简单的倒背如流,复杂的耳熟能详,毕竟有些大牛
,就喜欢写这种脚本呢。
更多精彩文章。
Linux五件套之类的。