awk是一种通用脚本语言,用于高级文本处理的。它主要用作报告和分析工具。与大多数其他程序性编程语言不同。
awk是数据驱动的,这意味着您必须定义一组针对输入文本要执行的操作。它获取输入数据,对其进行转换,然后将结果发送到标准输出。
awk有几种不同的实现。我们将使用awk的gnu实现,称为gawk。在大多数linux发行版可用,awk命令只gawk的符号链接。
在本教程的所有示例中,我们将使用teams.txt文件作为awk的输入,teams.txt文件内容如下所示。
bucks milwaukee 60 22 0.732 raptors toronto 58 24 0.707 76ers philadelphia 51 31 0.622celtics boston 49 33 0.598pacers indiana 48 34 0.585记录和字段awk可以处理文本数据和流。将输入的数据分为记录和字段。awk一次对一条记录进行操作,直到达到输入结束为止。
记录由记录分隔符分隔。默认的记录分隔符是换行符,这意味着文本数据中的每一行都是一条记录。可以使用rs变量来设置记录分的隔符。
记录由多个字段组成,并且使用字段分隔符分隔。默认情况下,字段之间用空格分隔,可以是一个或多个制表符,空格等,你可以使用awk命令的-f选项指定字段的分隔符。
每条记录中的字段都可以使用美元符号$后跟字段编号表示,从1开始。第一个字段由$1表示,第二个字段由$2表示。
依此类推,最后一个字段也可以用特殊变量$nf表示。整个记录可以用$0表示。
下面可以直观展示记录和字段的关系,也是awk处理文本数据默认使用的记录分隔符,即换行符。字段分隔符是空格符。
tmpfs 788m 1.8m 786m 1% /run/lock /dev/sda1 234g 191g 31g 87% /|-------| |--| |--| |--| |-| |--------| $1 $2 $3 $4 $5 $6 ($nf) --> 字段 $1,$2...字段|-----------------------------------------| $0 --> 记录由多个字段组成的单行记录awk命令要使用awk处理文本,需要编写程序来告诉awk命令该做什么。程序由一系列规则和用户定义的函数组成。
每个规则包含模式pattern和操作action的键值对。多个规则使用换行符或分号;分隔。通常awk程序看起来就像这样pattern { action }。
当awk处理数据时,如果模式与记录匹配,awk将会对记录执行指定的操作。当规则没有模式时,所有记录/行都匹配。
awk action必须使用花括号{}括起来,并由多个语句组成。每个语句指定要执行的操作。
action可以有一个或者多个语句,使用用换行符或分号;隔开。如果规则中没有action,则默认打印整个记录。
awk支持不同类型的语句,包括表达式,条件,输入,输出语句等。最常见的awk语句是。
exit停止执行整个程序并退出。next停止处理当前记录,并移至输入数据下一个记录。
print打印记录,字段,变量和自定义文本。printf使您可以更好地控制输出格式,类似于c和bash的printf函数。
编写awk程序时,井号#之后直至行末的所有内容均都被视为注释。可以使用反斜杠\\将长行分成多行。
运行awk程序awk程序可以通过多种方式运行。如果程序简短且简单,则可以将其直接通过命令行传递给awk解释器。
在命令行运行awk程序时,应将程序括在单引号''中,这样可以不会被shell程序解释。这是在命令运行awk程序的语法形式awk 'program' input-file...。
'program'是awk要运行的程序,input-file是输入文件,可以是一个或者多个文件。
如果程序又大又复杂,最好将其放入文件中,并使用-f选项将文件传递给awk命令。这是运行awk运行程序文件的语法形式awk -f program-file input-file...。
program-file是awk程序的文件,input-file是输入文件,可以是一个或者多个文件。
awk 'program' input-file... awk -f program-file input-file...awk模式awk中的模式控制着是否要执行相关联的操作。awk支持不同类型的模式,包括正则表达式,关系表达式,范围和特殊表达式模式。
当没有模式时,将匹配每个输入的记录。命令awk '{ print $3 }' teams.txt仅包含操作,没有模式。
程序将打印每条记录的第三个字段$3,默认字段分隔符是空格,所以以下数值是teams.txt文件的第三列的数据。
awk '{ print $3 }' teams.txt6058514948正则表达式模式正则表达式是与一组字符串匹配的模式。awk正则表达式模式包含在斜杠//中。这是正则表达式模式语法形式/regex pattern/ { action }。
模式可以是任何类型的扩展正则表达式。最基本的示例是文字或字符串匹配。
例如命令awk '/0.5/ { print $1 }' teams.txt仅打印包含0.5记录的第一个字段。
命令awk '/^[0-9][0-9]/ { print $1 }' teams.txt将会搜索以两个或多个数字开头的记录,并打印第一个字段。
awk '/0.5/ { print $1 }' teams.txtcelticspacersawk '/^[0-9][0-9]/ { print $1 }' teams.txt76ers关系表达模式关系表达式模式通常用于匹配指定字段或变量的内容。默认情况下,正则表达式模式与记录进行匹配。
要将正则表达式与字段进行匹配,请指定字段并针对模式使用包含比较运算符约等于号~。要匹配不包含指定模式的字段,请使用不约等于运算符!~。
除了约等于和不約等于符号之外,您可以比较字符串或数字之间的关系,例如大于>,小于 50 { print $1 }' teams.txt将会搜索三字段大于50的所有记录,并打印第一字段。
awk '$3 > 50 { print $1 }' teams.txtbucksraptors76ers范围模式范围模式由用逗号分隔的两个模式组成,从匹配第一个模式的记录开始,直到匹配第二个模式的记录停止匹配。
也就是说匹配两个模式之间的记录都会被执行相关的操作。即使中间记录没有匹配模式也将会被执行相关操作。
但有一点值得注意的是范围模式不能与某些模式表达式组合使用。但范围模式可以与关系表达式组合使用。
例如命令awk '/raptors/,/celtics/ { print $1 }' teams.txt将会搜索从包含raptors的记录开始到包含celtics记录结束的所有记录。
然后打印两个模式之间所有记录的第一个字段{ print $1 }。
awk '/raptors/,/celtics/ { print $1 }' teams.txtraptors76ers //这个记录没有匹配到两个模式中任意一个,但它在两个模式之间,所以也会打印celtics例如命令awk '$4 == 31, $4 == 33 { print $0 }' teams.txt组合范围模式和关系表达式。
将会搜索第四个字段等于31记录开始,直到第四个字段等于33的所有记录。然后打印整个记录$0。
awk '$4 == 31, $4 == 33 { print $0 }' teams.txt76ers philadelphia 51 31 0.622celtics boston 49 33 0.598特殊表达模式awk可以使用的特殊模式是。begin用于在处理记录之前执行的操作。end用于在处理记录后执行操作。
begin模式通常用于声明变量,end模式通常用于处理记录中的数据,例如统计指定字段的总数。
如果程序只有begin模式,则执行操作,并且不处理输入数据。如果程序只有end模式,则在执行操作之前先处理输入。
awk的gnu版本还包含另外两个特殊模式beginfile和endfile,它们允许您在处理文件时执行操作。
在下面的示例中将打印start processing.,然后打印每个记录的第三个字段,最后打印end processing.。这是一个简单的示例,你也可以用于打印字段的名称。
awk 'begin { print start processing. }; { print $3 }; end { print end processing. }' teams.txtstart processing6058514948end processing.组合模式awk允许您使用逻辑and运算符&&和逻辑或运算符||组合两个或多个模式。
例如命令awk '$3 > 50 && $4 50 && $4 < 30 { print $1 }' teams.txtbucksraptors内置变量awk具有许多内置变量,这些变量包含非常有用的信息,并允许您控制程序的处理方式。
这是一些最常见的内置变量。nf记录中的字段总数。nr当前记录的编号。filename当前正在处理文件名称。
fs字段分隔符。rs记录分隔符。ofs输出字段分隔符。ors输出记录分隔符。
awk变量可以在程序的任何行声明。要为整个程序定义变量,请将其放在begin模式中。
例如命令awk 'end { print file, filename, contains, nr, lines. }' teams.txt。将会打印打印文件名和行数,即记录总数。
awk 'end { print file, filename, contains, nr, lines. }' teams.txtfile teams.txt contains 5 lines.更改字段与记录分隔符字段分隔符的默认是空格符,你也可以指定为任意数量的字符,空格,制表符等任何字符。
要修改字段分隔符。可以在awk程序声明fs变量来进行修改。也可以使用awk命令的-f选项更改字段分隔符。
例如命令awk 'begin { fs = . } { print $1,$2 }' teams.txt将字段分隔符设置为.。awk的-f选项的等价命令是awk -f . '{ print $1,$2 }' teams.txt。
awk 'begin { fs = . } { print $1,$2 }' teams.txtawk -f . '{ print $1,$2 }' teams.txtbucks milwaukee 60 22 0 732 raptors toronto 58 24 0 707 76ers philadelphia 51 31 0 622celtics boston 49 33 0 598pacers indiana 48 34 0 585记录分隔符是换行符,可以通过修改rs变量进行更改。与字段的分隔符一样你可以指定为任意数量的字符,空格,制表符等任何字符。
例如命令awk 'begin { rs = . } { print $1 }' teams.txt将会修改记录分隔符为.。
awk 'begin { rs = . } { print $1 }' teams.txtbucks milwaukee 60 22 0732 raptors toronto 58 24 0707 76ers philadelphia 51 31 0622celtics boston 49 33 0598pacers indiana 48 34 0585awk action操作awk action操作括在大括号{}中,并在模式匹配时执行。一个操作可以有零个或多个语句。
多个语句按照它们出现的先后顺序执行,并且必须使用换行符或分号分隔;。
awk支持几种类型的语句。 表达式 ,例如变量赋值,算术运算符,增量和减量运算符。
控制语句 ,用于控制程序的流程if,for,while,switch。 输出语句 ,例如print和printf。
复合语句 ,可将其他语句分组。 输入语句 ,以控制输入的处理。 deletion语句 ,删除数组元素。
print语句可能是最常用的awk语句。它打印文本,记录,字段和变量的格式化输出。打印多个字段时,需要用逗号分隔。
例如命令awk '{ print $1, $3, $5 }' teams.txt打印的1,3,5字段用空格分隔。如果您不使用逗号,则字段之间没有空格,这些字段是串联在一起的。
awk '{ print $1, $3, $5 }' teams.txtawk '{ print $1 $3 $5 }' teams.txtbucks 60 0.732raptors 58 0.70776ers 51 0.622celtics 49 0.598pacers 48 0.585如果没有为print指定参数,默认是print $0,将打印当前记录。要打印自定义文本,文本必须用双引号引起来。
例如命令awk '{ print the first field:, $1}' teams.txt将会打印自定义文本the first field:和第一个字段。
awk '{ print the first field:, $1}' teams.txtthe first field: bucksthe first field: raptorsthe first field: 76ersthe first field: celticsthe first field: pacers您还可以打印特殊字符,例如换行符。
awk 'begin { print first line\\nsecond line\\nthird line }'first linesecond linethird lineprintf语句为了使您可以更好地控制输出格式,你可以使用printf语句。例如命令awk '{ printf %3d. %s\\n, nr, $0 }' teams.txt将会为记录插入行号。
nr变量是当前记录的编号,将会插入到占位符号%3d,$0变量表示当前正在处理的记录,将会插入到占位符号%s。
printf不会在每条记录后创建换行符,因此还在最后使用\\n 换行符,进行对记录的换行。
awk '{ printf %3d. %s\\n, nr, $0 }' teams.txt1. bucks milwaukee 60 22 0.732 2. raptors toronto 58 24 0.707 3. 76ers philadelphia 51 31 0.622 4. celtics boston 49 33 0.598 5. pacers indiana 48 34 0.585统计字段总和命令awk '{ sum += $3 } end { printf %d\\n, sum }' teams.txt计算记录中第三字段值的总和。
程序{ sum += $3 }对第三个字段进行累计,end模式程序{ printf %d\\n, sum }会将sum变量插入%d,\\n是换行符号。
awk '{ sum += $3 } end { printf %d\\n, sum }' teams.txt266运行awk文件这是一个awk命令的示例awk 'begin { i = 1; while (i < 6) { print square of, i, is, i*i; ++i } }'。
显示了如何使用表达式和控制语句来打印从1到5的数字的平方。
这时单行命令显得更难理解和维护。在编写长且复杂的程序时,您应该创建一个单独的程序文件。
然后使用awk命令的-f选项指定程序文件,awk解释器将会运行指定的文件运行程序。
awk -f prg.awkbegin { i = 1 while (i < 6) { print square of, i, is, i*i; ++i } }您还可以在awk的程序文件中使用shebang指令设置awk解释器,程序文件内的代码将会使用awk解释器运行。
当创建awk程序后,保存文件并使用chmod命令使程序文件可执行。这样你就可以直接运行awk程序。
chmod +x prg.awk./prg.awk#!/usr/bin/awk -fbegin { i = 1 while (i < 6) { print square of, i, is, i*i; ++i } }awk程序与shell变量如果您在shell程序脚本中使用awk命令,则很可能需要将shell程序变量传递给awk程序。
一种选择是用双引号而不是单引号将程序引起来,并在程序中替换变量。但是,此方式会使您的awk程序更加复杂,因为您需要对awk变量进行转义。
在awk程序中使用shell变量的推荐方法是将shell变量分配给awk变量。这是一个例子:
num=51awk -v n=$num 'begin {print n}'51结论awk是最强大的文本处理工具之一。本文几乎没有触及awk编程语言所有知识。要了解awk的更多信息,请查看官方gawk文档。
无人机的数字王国 小学生也能一看就懂数字飞行卡
无服务器、SASE、AI工程、云提供商产品融合正成为2021年云计算的趋势
如何测试D类功放?
1.8V3V升3.6V升5V 300MA小尺寸升压 DC/DC-AH2661
浅析平衡混频器的工作原理
Linux Awk命令实例教程
关于高速数控钻及平面数控钻床的功能介绍
aigo国民好物固态硬盘P7000这就是PCle4.0的魅力
英飞凌1200V CoolSiC™ MOSFET助力不同功率的工业电源实现最高效率
Matter 中国区开发者大会报名将满额!精彩演讲、经验分享…满满干货等你来!
如何组装一个简单而强大的手柄控制器
Synaptics将为Android推出压力触控技术
无霍尔BLDC电机控制
FSH-LA线性泵特点与优势
用纸做的温度传感器,效果还不错哦
隔空充电技术的原理是什么?距离成熟落地还远吗?
锂电领域具有代表性的10大兼并购案例简介
学技术 | POE 60W产品MOSFET的选型要求
Agilent E4408B/E4403B/E4404B/E
2020世界互联网大会发展报告正式对外公开