![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
awk教程
文章平均质量分 58
awk技术
这个作者很懒,什么都没留下…
展开
-
awk赋值操作符
一旦变量被赋予了一个值,那么就可以用这个变量名来引用这个值。下面的表达式表示将变量x的值和1相加并将结果赋给变量y:y = x + 1即计算x加1的值,并将结果赋给变量y。语句print y打印y的值。如果下面的一系列语句将出现在脚本中:x = 1y = x + 1print y那么y的值为2。我们可以将这3个原创 2015-06-14 19:40:44 · 920 阅读 · 0 评论 -
awk布尔操作符
使用布尔操作符可以将一系列的比较组合起来。下表列出了布尔操作符。运算符含义例子&&逻辑与a && b||逻辑或a || b!逻辑非!a给定两个或多个表达式,只有当给定的表达式之一的值为真(非零或非空)时,使用操作符||的整个表达原创 2015-06-21 19:15:58 · 722 阅读 · 0 评论 -
awk读输入(getline)
还是按照惯例,直接上例子。$ awk 'BEGIN{"date" | getline d; print d}' datafileMon Jan 15 11:24:24 PST 2015说明:将Linux的date命令通过管道传给getline函数,结果保存在变量d中并打印出来。范例$ awk 'BEGIN{"date" | getline d; sp原创 2015-05-18 21:44:51 · 795 阅读 · 1 评论 -
awk关系操作符
关系操作符和布尔操作符用于在两个表达式之间进行比较。下表列出了关系操作符。关系操作符运算符含义示例小于x 小于等于x ==等于x == y!=不等于x != y>=大于等于x >= y原创 2015-06-20 19:09:10 · 1087 阅读 · 0 评论 -
awk处理多行记录
我们所有的例子中用到的输入文件其记录都是由单独一行组成的。在这一部分,我们将演示如何读入一个记录,而记录中的每个字段都由单独一行组成。前面我们了解了处理姓名和地址的文件的例子。让我们假设相同的数据保存在块格式的文件中。不是将所有的信息放置在一行,而是将人名放在一行,在下一行放置公司名、依此类推。下面是一个记录样本:John RobinsonKoren Inc.978 C原创 2015-06-18 20:53:09 · 5143 阅读 · 1 评论 -
awk应用-支票簿的结算
这是一个简单的应用,用于处理支票登记条目。虽然不一定是最简单的结算支票簿的方法,但使用awk来完成某事的速度会快得令人惊奇。假设已经输入了一个如下的文件:$ cat checkbook.test1000125 Market -125.45126 Hardware Store -34.95127 Video Store -7.45128原创 2015-06-17 21:53:03 · 647 阅读 · 0 评论 -
awk内置变量的应用
现在我们来看一些例子,它们以变量NR开头。将前面计算平均成绩的脚本中的print语句修改为:$ cat gradesjohn 85 92 78 94 88andrea 89 90 75 90 86jasper 84 88 80 92 84$ cat grades.awk#求5个成绩的平均值{ total = $2 + $3 + $4 + $5 + $6a原创 2015-06-16 21:11:45 · 683 阅读 · 0 评论 -
awk命令行参数
直接举个例子来说明code lang="powershell">$ cat datafilenorthwest NW Joel Craig 3.0 .98 3 4western WE Sharon Kelly 5.3 .97 5 23southwest SW Chris Foster 2.7 .8原创 2015-05-17 19:43:09 · 969 阅读 · 0 评论 -
用户自定义函数
举例来说明$ cat datafilenorthwest NW Joel Craig 3.0 .98 3 4western WE Sharon Kelly 5.3 .97 5 23southwest SW Chris Foster 2.7 .8 2 18southern SO原创 2015-05-20 21:15:23 · 832 阅读 · 0 评论 -
使用字段的值作为数组下标
对于awk命令,任何表达式都可以用作数组的下标。所以,也可以用字段作下标。下面的例子中的程序用于计算所有名字在第2 个字段出现的次数,并引入了一种for循环的新形式。for(index_value in array) statement在前面介绍的例子中,END块中出现的for循环的工作过程如下:变量name被设为count数组的索引值,在每次for循环的迭代中,执行pri原创 2015-05-07 20:56:08 · 1673 阅读 · 0 评论 -
awk 的时间函数
awk提供了两个函数来获取时间和格式化时间戳:systime和strftime。systime函数 systime函数将返回自1970 年1月l日以来经过的时间(按秒计算)。格式systime()范例$ awk 'BEGIN{now=systime();print now}'939515282说明:systime函数的返回值被赋给一个原创 2015-05-16 20:06:25 · 5766 阅读 · 0 评论 -
awk固定字段
下面这个例子中,字段都是固定宽度的,但没有使用字段分隔符。substr函数可以用来创建字段。范例$ cat fixed031291ax5633(408)987-0124021589bg2435(415)866-1345122490de1237(916)933-1234010187ax3458(408)264-2546092491bd9923(415)134-89原创 2015-05-14 20:26:41 · 1184 阅读 · 0 评论 -
awk关联数组的下标
使用变量作为数组索引请参见范例范例$ cat employeesTom Jones 4424 5/12/66 543354Mary Adams 5346 11/4/63 28765Sally Chang 1654 7/22/54 650000Billy Black 1683 9/23/44 336500$ awk '{name[x++]=$原创 2015-05-06 22:17:27 · 2857 阅读 · 0 评论 -
awk多行记录
到目前为止,本教程用作例子的所有数据文件中,每条记录都自成一行。而在下面这个名为checkbook的示例数据文件中,记录之间用空行分隔,同一记录的字段之间则用换行符分隔。要处理这个文件,就必须将记录分隔符(RS)设为空值,而把字段分隔符(FS)设为换行符。$ cat checkbook1/1/04#125-695.00Mortgage1/1/04#126原创 2015-05-15 20:43:13 · 813 阅读 · 0 评论 -
awk用户自定义函数
脚本中凡是可以出现模式操作规则的位置都可以放置用户自定义的函数。格式函数名(参数,参数,参数, ...){ 语句 return 表达式 (注: return语句和表达式都是可选项)}变量以参数值的方式传递,且仅在使用它的函数中局部有效。函数使用的只是变量的副本。数组则通过地址或引用被传递,因此,可以在函数中直接修改数组的元素。函数中的任原创 2015-05-13 20:19:54 · 2034 阅读 · 0 评论 -
awk应用-获取文件的信息(一)
现在我们来学习UNIX命令ls的几个脚本。下面的执行命令ls -l得到的一个长列表样本$ ls -l-rw-rw-rw- 1 dale project 6041 Jan 1 12:31 com.tmp-rwxrwxrwx 1 dale project 1778 Jan 1 11 :55 combine.idx-rw-rw-rw- 1 dale project 1原创 2015-06-22 22:41:21 · 882 阅读 · 0 评论 -
awk应用-获取文件的信息(二)
我们所编写的操作将应用于所有的输入行。当awk读入所有的输入行后,所产生的总数必须打印出来,因此,我们编写了一个由END规则控制的操作:END { print "Total: ", sum, "bytes (" filenum " files)" }我们还可以使用BEGIN 规则给报告增加列标题。BEGIN { print "BYTES", "\t",原创 2015-06-23 21:59:50 · 566 阅读 · 0 评论 -
awk应用-计算学生的平均成绩
让我们来看awk应用的一个例子,其中先对一系列学生的成绩进行相加,然后计算其平均值。下面是输入文件的具体数据:$ cat gradesjohn 85 92 78 94 88andrea 89 90 75 90 86jasper 84 88 80 92 84在学生的姓名后面有5个成绩。下面的脚本将给出每个学生的平均成绩:$ cat grades.awk原创 2015-06-15 20:47:24 · 2304 阅读 · 0 评论 -
awk转义序列与算术操作符
可以使用表达式来存储、操作和检索数据,这些操作与sed中的有很大的区别,但这是大多数程序设计语言所具有的共同特性。一个表达式通过计算返回一个值。表达式由数字和字符串常量、变量、操作符、函数和正则表达式组成。我们在之前的文章中中详细介绍了正则表达式。在这一部分,我们将学习由常量、变量和操作符组成的表达式。常量有两种类型:字符串型或数字型( "red"或1)。字符串在表达式中必须用引号原创 2015-06-13 16:17:47 · 1293 阅读 · 0 评论 -
字段的划分完整的问题
可以使用3个完全不同的方法使awk分隔字段。第一个方法是用空白字符来分隔字段。要实现这种方法,可将FS设置为一个空格。在这种情况下,记录的前导空白字符和结尾空白字符(空格和/或制表符)将被忽咯。因为FS的默认值为一个空格,所以这也是通常情况下awk将记录划分为字段的方法。第二个方法是使用其他单个字符来分隔字段。例如, awk程序经常使用":"作为分隔符来访问UNIX /etc/passwd原创 2015-06-11 20:57:57 · 936 阅读 · 0 评论 -
awk条件语句
条件语句用于在执行操作之前做一个测试。在前面的章节中,我们看到了模式匹配规则的一些示例。模式匹配规则本质上就是影响输入循环的条件表达式。在这一部分,我们主要就在action中所使用的条件语句进行探讨。条件语句以if开头,并计算放在圆括号中的表达式。语法是:if (expression)action1[elseaction2]如果条件表达式expression的值原创 2015-07-02 19:28:44 · 1398 阅读 · 0 评论 -
awk向脚本传递参数(二)
命令行参数的一个重要限制是它们在BEGIN过程中是不可用的。也就是说,直到首行输入完成以后它们才可用。为什么?这是一个容易混乱的部分。从命令行传递的参数就好像文件名一样被处理。赋值操作知道这个变量(如果它是一个文件名)被求值时才进行。参阅下面的脚本,该脚本将变量n设置为一个命令行参数。awk ' BEGIN { print n }if (n == 1) print "Rea原创 2015-07-01 20:05:54 · 1378 阅读 · 0 评论 -
向脚本传递参数(一)
在awk中,一个容易引起混乱的地方就是向脚本传递参数。参数将值赋给一个变量,这个变量可以在awk脚本中访问。这个变量可以在命令行上设置,放在脚本的后面,文件名前面。awk 'script' var=value inputfile每一项都必须作为单一的参数来解释。因此,在等号的两边不允许出现空格。也可以用这个方法传递多个参数。例如,如果想在命令行定义变量high和low,原创 2015-06-30 21:18:10 · 624 阅读 · 0 评论 -
awk向脚本传递参数(一)
在awk中,一个容易引起混乱的地方就是向脚本传递参数。参数将值赋给一个变量,这个变量可以在awk脚本中访问。这个变量可以在命令行上设置,放在脚本的后面,文件名前面。awk 'script' var=value inputfile每一项都必须作为单一的参数来解释。因此,在等号的两边不允许出现空格。也可以用这个方法传递多个参数。例如,如果想在命令行定义变量high和low,原创 2015-06-30 21:19:20 · 1462 阅读 · 0 评论 -
awk模式匹配
在这篇文章中,我们将看到许多小的,甚至没有什么意义的例子,但他们能够验证awk程序脚本的主要特点。当awk读入一行时,它试图匹配脚本中的每个模式匹配规则。只有与一个特定的模式相匹配的输入行才能成为操作对象。如果没有指定操作,与模式相匹配的输入行将被打印出来(执行打印语句是一个默认操作)。参阅下面的脚本:/^$/ { print "This is a blank line原创 2015-06-09 22:47:24 · 996 阅读 · 0 评论 -
awk 程序设计模型
理解awk提供给程序员的基本模型是很重要的。学习awk比学习其他程序设计语言更容易的部分原因,是由于awk为程序员提供了定义得当且有用的模型。awk 程序是由所谓的主输入(main input) 循环组成的。一个循环是一个例程,它将一直重复执行直到有一些存在的条件终止它。你不必写这个循环,他是现成的,它作为一个框架存在,在这个框架中你编写的代码能够执行。你所编写的处理操作的代码假设有一个可原创 2015-06-08 20:11:22 · 557 阅读 · 0 评论 -
awk应用-信息的检索
awk应用-信息的检索awk程序可以用于检索数据库中的信息,数据库实际上是各种类型的文本文件。文本文件的结构化越好,对其处理就越容易工作,尽管这个结果不过是由独立的单词组成的行。下面这个首字母缩写词列表是一个简单的数据库。$ cat acronymsBASIC Beginner' s AI I-Purpose Symbol ic Instruction Co原创 2015-06-28 19:41:49 · 640 阅读 · 0 评论 -
格式化打印(一)
我们编写的许多脚本可以很好地实现对数据的操作,但没有对输出进行适当的格式化。这是因为基本的print语句所能做的工作有限。因为awk的大多数功能是产生报告,因此以整齐的样式产生格式化报告是很重要的。程序filesum可以很好地处理数据,但它的报告缺乏整齐的格式。awk提供的printf可以代替print语句,printf是借用了C程序设计语言。printf语句和print语句一样可以打印一原创 2015-06-26 22:10:45 · 816 阅读 · 0 评论 -
格式化打印(二)
printf语句可以规定输出域的宽度和对齐方式。一个格式表达式由3个可选的修饰符组成,跟在"%"后面,并出现在格式说明符之前。%-width.precision format-specifier描述输出字段宽度的width是一个数值。当指定域宽度时,这个域的内容默认为向右对齐。必须指定"-"来设置左对齐。因此, "%-20s" 输出的走向左对齐的一个域长度为20个字符的原创 2015-06-27 21:08:44 · 560 阅读 · 0 评论 -
awk应用-获取文件的信息(三)
继续前面两节的内容,我们来看下面修改后的、加了注释的脚本:#!/bin/bashls -l $* | awk '/* filesum: 列出文件总的字节数*//* 输入:由命令"ls -l"生成的长列表*//*#1 输出列的标题*/BEGIN { print "BYTES", "\t", "FILE" }/*#2 测试第9个字段,文件以"-"开始原创 2015-06-24 21:40:30 · 992 阅读 · 0 评论 -
awk控制函数
直接来例子$ cat datafilenorthwest NW Joel Craig 3.0 .98 3 4western WE Sharon Kelly 5.3 .97 5 23southwest SW Chris Foster 2.7 .8 2 18southern SO原创 2015-05-19 19:10:07 · 482 阅读 · 0 评论 -
awk控制语句
break和continue语句可以在某个特定条件为真时,使用break语句跳出循环。continue 语句的作用则是在特定条件为真时,让循环跳过continue之后语句,将控制转回循环顶部,开始下一轮循环。范例$ awk '{ for(x = 3; x if($x /*break out of for loop*/ }}' file原创 2015-05-05 22:14:33 · 898 阅读 · 0 评论 -
输入重定向(getline)
getline函数: getline函数用于从标准输入、管道或文件(非当前处理的文件)读取输入。getline函数用于读取下一输入行,并且设置内置变量NF、NR和FNR。如果读到一条记录,函数就返回1. 如果读到EOF(end of fiJe,文件末尾)则返回0。如果发生错误,比如打开文件失败,则getline函数返回-1。范例$ awk 'BEGIN{"date" | g原创 2015-05-01 21:34:31 · 694 阅读 · 0 评论 -
awk循环
循环的功能是:当测试表达式的条件为真时,重复执行表达式后面的语句。循环常常被用来对记录中的每个字段重复执行某种操作,或者在END块中用来循环处理某个数组中的所有元素。awk有3种类型的循环:while 循环、for循环和特殊for循环。1. while循环使用while循环的第一步是给一个变量设初值,然后在while表达式中测试该变量。如果求得表达式的值为真(非0),则进入循环体执原创 2015-05-04 22:12:47 · 7205 阅读 · 0 评论 -
awk模式
awk模式用来控制awk命令对输入的文本行执行什么操作。模式由正则表达式、判别条件真伪的表达式或二者的组合构成。awk的默认操作是打印所有使表达式结果为真的文本行。模式表达式中暗含着if语句。如果模式表达式含有if(如果)的意思,就不必用花括号把它括起来。当if是显式地给出时,这个表达式就成了操作语句,语法将不一样(参见条件语句 )。范例$ cat employeesTom转载 2015-04-15 22:28:14 · 354 阅读 · 0 评论 -
OFMT 变量
打印数字时,可能需要控制数字的格式。这可以通过printf函数来实现,但是,通过设置一个特殊的awk变量OFMT,使用print函数时也可以控制数字的打印格式。OFMT的默认值是"%.6gd",表示只打印小数部分的前6 位(之后我们会介绍如何修改OFMT的值)。$ awk 'BEGIN{OFMT="%.2f";print 1.2567,12E-2}'1.25 0.12转载 2015-04-08 22:45:31 · 990 阅读 · 0 评论 -
awk字段
每条awk记录都是由字段(field)组成,默认情况下,字段间用空白符(即空格或制表符)分隔。每个这样的词称为一个字段,awk在内置变量NF中保存记录的字段数。NF的值因行而异,其上限与具体版本的实现相关,通常是每行最多100个字段。可以创建新的字段。下面这个例子中有4条记录(行)和5个字段(列)。每条记录都是从第一个字段(用$1表示)开始,然后是第二个字段($2) ,以此类推。范例转载 2015-04-13 22:22:44 · 767 阅读 · 0 评论 -
awk字段分隔符
输入字段分隔符:awk的内置变量FS中保存了输入字段分隔符的值。使用FS的默认值时,awk用空格或制表符来分隔字段,并且删除各字段前多余的空格或制表符。可以通过在BEGIN语句中或命令行上赋值来改变FS的值。接下来我们就要在命令行上给FS指定一个新的值。在命令行上改变FS的值需要使用-F选项,后面指定代表新分隔符的字符。原创 2015-04-14 19:55:22 · 8510 阅读 · 0 评论 -
awk算术运算
可以在模式中执行计算。awk命令都将按浮点方式执行算术运算。下表列出了所有的算术运算符。运算符含义例子+加x+y-减x-y*乘x*y/除x/y%模x%y^幂x^转载 2015-04-23 22:32:16 · 5983 阅读 · 0 评论 -
awk print函数
awk命令的操作部分被括在大括号内。如果未指定操作,则匹配到模式时, awk 会采取默认操作,即在屏幕上打印包含模式的行。print函数用于简单的输出。更为复杂的输出则要使用printf 和sprintf 函数。如果熟悉C语言,那么一定懂得如何使用printf和sprintf。原创 2015-04-07 22:18:38 · 3331 阅读 · 0 评论