讲讲Linux生产环境中,最常用的“AWK“技巧

敢用自己的名字做软件名字的,都有非常强大的自信。比如,垠语言什么的。

awk的命名得自于它的三个创始人姓别的首字母,都是80来岁的老爷爷了。当然也有四个人的组合:流行的GoF设计模式。但对于我这游戏爱好者来说,想到的竟然是三位一体,果然是不争气啊。

它长的很像C,为什么这么有名,除了它强大的功能,我们姑且认为a这个字母比较靠前吧。awk比sed简单,它更像一门编程语言。

打印某一列

下面,这几行代码的效果基本是相同的:打印文件中的第一列。

#JavaSystem.out.println(aStr.split(" ")[0]);#Pythonprint(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命令的组成部分。

讲讲Linux生产环境中,最常用的“AWK“技巧

一般的开发语言,数组下标是以0开始的,但awk的列$是以1开始的,而0指的是原始字符串。

网络状态统计

本小节,采用awk统计netstat命令的一些网络状态,来看一下awk语言的基本要素。netstat的输出类似于:

讲讲Linux生产环境中,最常用的“AWK“技巧

其中,第6列,标明了网络连接所处于的网络状态。我们先给出awk命令,看一下统计结果。

netstat  -ant | awk ' \    BEGIN{print  "State","Count" }  \    /^tcp/ \    { rt[$6]++ } \    END
{  for(i in rt){print i,rt[i]}  }'

输出结果为:

State CountLAST_ACK 1LISTEN 64CLOSE_WAIT 43ESTABLISHED 719SYN_SENT 5TIME_WAIT 146

下面这张图会配合以上命令详细说明,希望你能了解awk的精髓。

讲讲Linux生产环境中,最常用的“AWK“技巧

乍一看,好吓人的命令,但是很简单。awk和我们通常的程序不太一样,它分为四个部分。

1、BEGIN 开头部分,可选的。用来设置一些参数,输出一些表头,定义一些变量等。上面的命令仅打印了一行信息而已。

2、END 结尾部分,可选的。用来计算一些汇总逻辑,或者输出这些内容。上面的命令,使用简单的for循环,输出了数组rt中的内容。

3、Pattern 匹配部分,依然可选。用来匹配一些需要处理的行。上面的命令,只匹配tcp开头的行,其他的不进入处理。

4、Action 模块。主要逻辑体,按行处理,统计打印,都可以。

注意点

1、awk的主程序部分使用单引号‘包围,而不能是双引号2、awk的列开始的index是0,而不是1

例子

我们从几个简单的例子,来看下awk的作用。

1、输出Recv-Q不为0的记录

netstat -ant | awk'$2 > 0 {print}'

2、外网连接数,根据ip分组

netstat -ant | awk'/^tcp/{print $4}'| awk -F:'!/^:/{print $1}'| sort | uniq -c

3、打印RSS物理内存占用

top -b -n 1 | awk'NR>7{rss+=$6}END{print rss}

4、过滤(去掉)空白行

awk'NF'file

5、打印奇数行

awk'a=!a'file

6、输出行数

awk'END{print NR}'file

这些命令,是需要了解awk的一些内部变量的,接下来我们来介绍。

内置变量

FS

下面的两个命令是等价的 。

awk -F ':'  '{print $3}' fileawk 'BEGIN{FS=":"}{print $3}' file

BEGIN块中的FS ,就是内部变量,可以直接指定或者输出。如果你的文件既有用,分隔的,也有用:分割的,FS甚至可以指定多个分隔符同时起作用。

FS="[,:|]"

其他

OFS 指定输出内容的分割符,列数非常多的时候,简化操作。相似命令:

awk -F ':' '{print $1,"-",$2,"-",$4}' fileawk 'BEGIN{FS=":";OFS="-"}{print $1,$2,$4}' file 

NF 列数。非常有用,比如,过滤一些列数不满足条件的内容。

awk -F, '{if(NF==3){print}}'file

NR 行号,例如,下面两个命令是等价的。

cat -n fileawk '{print NR,$0}' file

RS 记录分隔标志ORS 指定记录输出的分隔标志

FILENAME 当前处理的文件名称,在一次性处理多个文件时非常有用

编程语言特性

数学运算

从上面的代码可以看出,awk可以做一些简单的运算。它的语言简洁,不需要显示的定义变量的类型。

比如上面的 rt[$6]++,就已经默认定义了一个叫做rt的hash(array?),里面的key是网络状态,而value是可以进行运算的(+-*/%)。

包含一些内置的数学运算(有限)

intlogsqrtexpsincosatan2randsrand

字符串操作

类似其他语言,awk也内置了很多字符串操作函数。它本来就是处理字符串的,所以必须强大。

length(str) #获取字符串长度split(input-
string,output-array,separator)substr(input-string, location, length)

语言特性

awk是个小型的编程语言,看它的基本语法,如果你需要复杂一点的逻辑,请自行深入了解,包括一些时间处理函数:

# logicif(x=a){}if(x=a){}else{}while(x=a)
{break;continue;}do{}while(x=a)for(;;){}# arrayarr[key] = valuefor(key 
in arr){arr[key]}delete arr[key]asort(arr) #简单排序

据说,awk可以胜任所有的文本操作。因为它本身就是一门语言啊。

End

曾经使用awk编写过复杂的日志处理和统计程序。虽然比写sed舒畅了很多,但还是备受煎熬。更加上现在有各种nawk,gawk版本之间的区别,所以业务复杂度一增长,就习惯性的转向更加简洁、工具更全的python。

awk处理一些简单的文本还是极其方便的,最常用的还是打印某一列之类的,包括一些格式化输出。对于awk,要简单的滚瓜烂熟,复杂的耳熟能详,毕竟有些大牛,就喜欢写这种脚本呢。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,635评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,628评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,971评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,986评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,006评论 6 394
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,784评论 1 307
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,475评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,364评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,860评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,008评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,152评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,829评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,490评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,035评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,156评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,428评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,127评论 2 356

推荐阅读更多精彩内容

  • 官网 中文版本 好的网站 Content-type: text/htmlBASH Section: User ...
    不排版阅读 4,392评论 0 5
  • 一. AWK 说明 awk的处理文本和数据的方式:它逐行扫描文件,从第一行到最后一行,寻找匹配的特定模式的行,并...
    西华子阅读 934评论 0 4
  • awk 是一个强大的文本分析工具。它不仅是 Linux 中,也是任何环境中现有的功能最强大的数据处理引擎之一。相对...
    尘世不扰阅读 593评论 1 6
  • awk介绍awk变量printf命令:实现格式化输出操作符awk patternawk actionawk数组aw...
    哈喽别样阅读 1,567评论 0 4
  • 基础命令 主要的命令和快捷键 Linux系统命令由三部分组成:cmd + [options]+[operation...
    485b1aca799e阅读 1,100评论 0 0