Linux三剑客(grep sed awk) 之 awk

awk

awk****推荐去看朱双印的博客“awk****从放弃到入门”,写的真的很好,本文的awk****就总结于它。

awk其实是一门编程语音,它支持条件判断、数组、循环等功能。所以,我们也可以把awk理解成一个脚本语言解释器

1、awk基础

1.1、普通模式

awk 【option】 ‘program’ file1,file2

image.png

1.2、特殊模式

image.png

1) BEGIN和END模块只能有一个。中间的pattern匹配,可以有多个

NR==2{print 1}NR==5{print1}

2) BEGIN模块,代表awk在处理文本前要做的事。即使不接收文件名,仅仅使用BEGIN模块打印,也能正常输出

awk ‘BEGIN {print “111”,”222”}’

3) END模块,代表awk在处理文本后要做的事

awk ‘{print 1,2} END{print ‘333’,’444’}’test

1.3、内置变量

image.png
image.png

1.4、自定义变量

awk除了使用内置变量,还可以自己定义变量。

方法一:-v varname=value 变量名区分字符大小写。-v:设置变量

方法二:在program中定义

1****、-v ****定义

image.png

2****、在program****定义

image.png

2、printf

awk本身负责文本切割,printf动作则负责格式格式化文本。在了解awk的printf动作前,需要首先了解printf命令

2.1、shell的printf命令

在shell中,echo和printf都是输出文本的命令。echo输出的字符串,会自动在末尾加上\n,

而printf不会。printf的作用是按照我们指定的格式输出文本,所以\n,也需要我们自己指定

echo与printf

image.png

注意看3,printf的优势就在于,可以用格式替换符,帮我们处理一长串的str

替换符号

格式替换符
image.png
转义字符
image.png
修饰符
image.png

“.5”表示整数的长度,不足用0补齐

例子
image.png
image

2.2、awk的printf动作

awk的printf动作与shell的printf命令很像,只是要注意几点:

1) 使用printf动作输出的文本不会换行,要自己手动加\n

2) 使用printf动作时,“指定的格式”与“被格式化的文本”间,要用“逗号”隔开

3) 使用printf动作,“格式替换符”与“被格式化的文本”数量一一对应

例子

image.png

awk -v FS=':' 'BEGIN{printf "%-10s\t %s\n","用户名称","用户ID"} {printf "%-10s\t %s\n",1,3}' /etc/passwd

用户名称 用户ID

root 0

bin 1

3、awk模式(Pattern)

3.1、grep与awk的正则对比

grep ‘^root’/etc/passwd

awk ‘/^root/{print $0}’ /etc/passwd

image.png
image.png
image

3.2、awk正则的注意点

1)awk命令中的正则是“扩展正则表达式”

2)当使用{x,y}或[[:space]],这种正则时,要加上参数—posix

3)注意对“\”和“.”转义

3.3、awk的行范围模式

image.png

两个正则的就是行范围模式,从正则1匹配的行开始,到正则2匹配的行结束

正则匹配符

image.png

3.4、例子

image.png
image

4、awk动作总结

4.0、动作拆分

image.png

上图的动作分为两个部分:

1) 红线标注:最外侧的括号“{}”。“组合语句”类型的动作,将多个代码组合成代码块

2) 蓝线标注:“print $0”。print是“输出语句”类型的动作

例子

image.png
image

4.1、if动作

image.png

如果if对应的{},只有一条命令,可以省略{}

4.2、for动作

image.png

4.3、while动作

image.png

4.4、do…while动作

do…while循环无论是否满足while的条件,都会先执行一次do里的命令

打印一遍test

image.png

打印5遍test

image.png

4.5、cotinue和break

1~5,不打印3

image.png

打印1~3

image.png

4.6、exit

awk中,exit表示跳过后序所有动作,直接执行END内的命令。如果没有END模式,则会直接结束awk命令

只打印1

image.png

不会打印$0

image.png

4.7、next

next的作用是跳过当前行。直接从下一行 开始处理

跳过第2行

image.png

5、awk数组

5.1、基础概念

1)awk中的数组是一个使用字符串作为下标的“关联数组”。

2)我们在使用时,可以用 数字/字符串 作为下标,不过使用数字作为下标时,awk默认会把“数字”下标转换为“字符串”。

3)在awk中,元素的值可以设置为“空”。

4)当一个元素不存在于数组时,如果我们直接引用这个不存在的元素,awk会自动创建这个元素,并且默认为这个元素赋值为“空字符串”

5)在awk中,判断数组中元素是否存在,用“if(下标 in 数组名)”。即判断数组中是否有key

6)使用split函数生成的数组,下标默认是从1开始的

5.2、基本操作

创建数组,直接创建就可以

image.png

删除数组中的元素

awk ‘BEGIN{ …;delete huluwa[0]}’

删除整个数组

awk ‘BEGIN{ …;delete huluwa}’

for循环有序遍历数组。只有下标是数字时,通过下标的递增,才能有序遍历

awk ‘BEGIN{ …;for (i=1;i<=3;i++){print i,huluwa[i];} }’

for循环无序遍历数组。因为awk数组本身是无序的关联数组

awk ‘BEGIN{ …;for (i in huluwa){print i,huluwa[i]} }’

实例应用——统计某文件$1 重复出现的次数

awk ‘{count[$1]++} END{ for (i in count ) {print i,count[i]} }’ file

实例应用——统计某文本人名出现次数

awk ‘{ for (i=1;i<=NF;i++) {count[$i]++} } END{ for (a in count) {print a,count[a]} }’

6、awk内置函数

6.1、算术函数

rand函数,srand函数,int函数

rand函数固定打印了0.237788,srand函数固定打印1,两者合用,可生成小于1的随机数

rand函数

awk 'BEGIN{print rand()}'

0.237788

srand函数

awk 'BEGIN{print srand()}'

1

生成小于1的随机数

awk 'BEGIN{srand();print rand()}'

0.319498

通过随机数乘100,在通过int函数取整,生成0~100间的随机数

awk 'BEGIN{srand();print int(100*rand())}'

76

6.2、字符串函数

gsub函数,sub函数

这两个函数用于替换某些 文本

awk ‘{ gsub (“old”,“new”,1);print0}’file

awk ‘{ gsub (“[a-z]”,“new”,1);print0}’file

gsub将指定范围内匹配的字符全部替换为新字符

sub用法与gsub一样,但只替换匹配范围内第一次匹配到的字符

比如某文件就一行,$1=aaa。

gsub(“a”,“b”),则1=bbb。第三个参数不加,则默认为0

sub(“a”,“b”),则$1=baa。

length函数

length函数可获取指定字符串的长度。不指定参数,默认为$0

awk ‘{ for (i=1;i<=NF;i++) {print i,length(i)} }’file

index函数

获取指定字符串位于整个字符串中的位置

awk ‘{print index($0,“LEE”)}’file

0

7

0

index函数在每一行中查找LEE,如果该行没有,返回0,该行有,返回位置

split函数

split函数可以切割字符串,帮我们动态生成数组。生成的数组下标从1开始

将ts以“;”分隔,并将分隔后的str保存到huluwa数组中

awk –v ts=”one;two;three”‘BEGIN{ print split(ts,huluwa,”;”)}’

split函数的返回值就是数组长度

split(ts,huluwa,”;”) == 3

6.3、排序函数

asort函数

asort函数根据数组的value值进行排序

asort排序后,原有key将被数字替代

awk 'BEGIN{ t["a"]=66;t["b"]=88;t["c"]=35 ; asort(t) ; for (i in t){print i,t[i]} }'

1 35

2 66

3 88

asort排序时,新建一个数组。t[]不变,新创了new[]

awk 'BEGIN{ t["a"]=66;t["b"]=88;t["c"]=35 ; asort(t,new) ; \

for (i in new){print i,new[i]} }'

asort函数的返回值就是数组的长度

asort(t,new)==3

asorti函数

asorti函数会对原数组的key排序,然后将key作为value生成一个新数组

awk 'BEGIN{ t["a"]=66;t["b"]=88;t["c"]=35;asorti(t,new);for (i in new){print i,new[i]} }'

1 a

2 b

3 c

通过asorti排列原数组

awk 'BEGIN{ t["a"]=66;t["b"]=88;t["c"]=35;asorti(t,new);\

for (i in new){print i,new[i],t[new[i]] } }'

1 a 66

2 b 88

3 c 35

7、三元运算与打印奇偶行

7.1、三元运算

if…else判断用户类型

awk –F : ‘{ if($3<500){usertype=“系统用户”}else{ usertype=“普通用户”};\

print $1,usertype }’/etc/passwd

三元运算符替换if…else

awk –F : ‘{ usertype=$3<500?“系统用户”: “普通用户”;\

print $1,usertype }’/etc/passwd

l $3<500:条件判断

l ?”系统用户”:为真,则“系统用户”赋给usertype

l :“普通用户”:为假,则“普通用户”赋给usertype

三元运算符统计“系统用户”和“普通用户”数量

awk -F: '{$3<500?a++:b++}END{print a,b}' /etc/passwd

7.2、打印奇偶行

打印奇数行

awk ‘a=!a’flie

打印偶数行

awk ‘!(a=!a)’flie

解析:

我们知道awk的正则匹配是

image.png

/

但如果我们不加print动作,仅仅有正则,那么会默认打印$0。

awk ‘/正则/’file

而在awk中,非0/非空str表示“真”。0/空表示“假”

注意,这不是正则,‘2’不为0/空,打印file所有

awk '2' file

所以’a=!a’

1) a没有定义,初始化a=‘’,a为“假”

2) !a为“真”

3) a=!a,a变为“真”,打印第1行

4) !a又变为“假”,不打印第2行

‘!(a=!a)’

1)a=!a为真,!(a=!a)为假,不打印 第1行

2)a=!a为假,!(a=!a)为真,打印第2行

8、参考文档

awk从放弃到入门 (http://www.zsythink.net/?s=awk)

awk用法(使用入门) (https://www.cnblogs.com/emanlee/p/3327576.html)

官方文档 (https://www.gnu.org/software/gawk/manual/html_node/index.html#SEC_Contents)

原文 : http://blog.51cto.com/12758568/2122677

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

推荐阅读更多精彩内容

  • 转载 原文的排版和内容都更加友好,并且详细,我只是在这里贴出了一部分留作自己以后参考和学习,如希望更详细了解AWK...
    XKirk阅读 3,185评论 2 25
  • Linux指令中文说明传送入口 整理自Linux指令中文说明 文本和数据进行处理的编程语言awk 是一种编程语言,...
    释闲人阅读 2,105评论 1 6
  • 本章主要学习内容awk介绍 awk基本用法 awk变量 awk格式化 awk操作符 awk条件判断 a...
    楠人帮阅读 1,252评论 0 8
  • awk:报告生成器,格式化文本输出 内容: awk介绍 awk基本用法 awk变量 awk格式化 awk操作符 a...
    BossHuang阅读 1,451评论 0 9
  • 在C语言中,五种基本数据类型存储空间长度的排列顺序是: A)char B)char=int<=float C)ch...
    夏天再来阅读 3,320评论 0 2