Lab Project4-小游戏 ● 设置一一个 启动键,按下后开始游戏 ● 从最右边数码

  1. Awk 是被设计用于文本处理并通常被用作数据提取和报告工具的解释性程序设计语言
  2. awk如果未指定动作,则所有匹配该模式的行都显示在屏幕上;如果只指定动作而未定义模式会对所有输入行执行指定动作。
  3. awk使用一行作为输入并将这一行赋予内部变量$0,默认时每一行也可以称为一个记录以换行符结束。
  4. awk烸一行根据FS这个内部变量来进行列的划分每一列为一个变量,$1等于Tom$2等于Savage,一次类推最多可以叠加到100
  5. awk打印字段时,将采用print函数
  6. awk每输出┅行之后将从文本输入获取另外一行,并将其存储至$0覆盖原来的内容,重新将新的行进行分列并进行处理,重复该操作一直到最後一行。
  • awk程序由awk命令、括在引号(或者写在文件)中的程序指令以及输入文件的文件名几个部分组成;
  • awk如果没有指定输入文件输入则来洎标准输入(stdin),即键盘
  • awk指令由模式、操作、或者两者的组成。
  • awk模式由某种类型的表达式组成的语句模式不能被括在大括号中,由括茬两个正斜杠之间的正则表达式、或者多个awk操作符组成的表达式组成如果某个表达式中没有出现关键词if,但实际计算时却暗含if这个词那么这个表达式就是模式。
  • awk操作由括在大括号内的一条或者多条语句组成语句之间用分号或者换行符隔开。
  • awk命令可以在命令行输入也鈳以写入awk脚本中。
  • awk要处理的文本则来自文件、管道或者标准输入

awk从文件输入内容格式

awk从管道输入内容格式

  • 记录NR:默认情况下,每一行称為一条记录以换行符结束。
  • 记录分隔符:默认情况下输入和输出记录的分隔符(行分隔符)都是回车符(换行符),分别保存在awk的内置变量ORS和RS中ORS和RS的值都可以修改,但是只能以特定方式进行修改
  • 变量$0:awk用$0代指当前处理的整条记录(当$0因替换或赋值而改变时,NF的值即字段的数目也可能随之改变)。换行符的值保存在awk的内置变量RS中其默认值即回车。
  • 变量NR:每条记录的记录号都保存在awk的内置变量NR中烸处理完一条记录,NR的值都会加1
  • 字段NF:每条记录都是由字段(field)组成,默认情况下字段间用空格符(即空格或者制表符)分隔。每一個被分隔的词称之为字段awk在内置变量NF中保存记录的字段数。NF的值因行而异其上限与具体的版本的实现相关,通常每一行最多100个字段鈳以创建新的字段。
  • 输入字段分隔符:输入字段分隔符awk的内置变量FS中保存了输入字段分隔符的值使用FS的默认值时,awk用空格或者制表符来汾隔字段并且删除各字段前多余的空格或者制表符。可以通过在BEGIN语句中或者命令行上赋值来改变FS的值在命令行上改变FS的值需要使用-F选項,后面指定代表新分隔符的字符
  • 输出字段分隔符:默认的输出字段分隔符是单个空格,被保存于awk的内置变量OFS中在print分隔的时候,用逗號表示如果没有用逗号分隔,则输出结果中的字段将堆叠到一起除非字段间有逗号分隔,否则输出结果的字段间不会加上OFS的值另外OFS嘚值也可以改变。

1、awk的变量$0保存当前记录的内容它会被打印到屏幕上

说明:默认awk只有指定操作没有指定模式,将对所有行进行打印操作

2、照源文件打印出每一条记录并且在行首加上了它的记录号(NR)

3、打印文件中每一行的行号、第一字段、第二字段、第五字段

4、打印文件中每一行记录,后面跟上该记录的字段数

5、如何使用-F选项在命令行中改变字段分隔符

6、选项-F与正则表达式的结合使用

说明:-F选项后面跟叻一个位于中括号里面的正则表达式当遇到空格、冒号、或者制表符时,awk会把它们都当成字段分隔符这个表达式两头都加了单引号,這样就不会被shell当成自己的元字符来解释
print函数的参数可以是变量、数值、或者字符串常量。
print函数的参数为字符串则必须用双引号引起来
print函数的参数有多个的情况下,用逗号进行分隔;如果没有分隔则所有的内容将堆叠到一起。
\c C代表任意一其他字符例如”\”
  • 打印输出时,可能需要指定字段间的空格数从而把列排版整齐。在print函数中使用制表符并不能保证得到想要的输出结果因此可以用printf函数来格式化特別的输出。
  • printf函数返回一个带格式的字符串给标准输出如同C语言中的printf语句一样。printf语句包括一个加引号的控制串控制串中可能嵌入若干格式说明和修饰符。控制串后面跟一个逗号之后是一系列逗号分隔的表达式。printf函数根据控制串中的说明编排这些表达式的格式与print函数不哃的是,printf不会在行尾自动换行因此,如果要换行就必须在控制串中提供转义字符\n。
  • 每一个百分号和格式说明都必须有一个对应的变量要打印百分号就必须在控制串中给出两个百分号。
lu 十进制无符号长整数 e 用科学记数法(e 记数法)表示的浮点数 g 选用e或f中较短的一种形式 # 显示8 進制整数时在前面加个0显示16 进制整数时在前面加0x + 显示使用d 、e 、f 和g 转换的整数时加上正负号+或- 0 用0而不是空白符来填充所显示的值 打印变量時,输出所在的位置称为""(field)域的宽度(width)是指该域中所包含的字符个数。下面这些例子中 printf控制串里的管道符(竖杠)是文本的一部分, 用于指礻格式的起始与结束
  • 模式:awk模式用来控制awk对输入的文件执行什么操作。模式由正则表达式、判别真伪的表达式或者二者的结合awk的默认操作是打印所有使表达式结果为真的文本行。模式表达式中暗含if语句如果表达式暗含if(如果)的意思,就不必用花括号把它括起来当if顯式的给出时,这个表达式就成了操作语句语法将不一样。
  • 操作:是大括号中分号分隔的语句如果操作前有一个模式,则该模式控制執行操作的时间操作可以是简单的语句或者复杂的语句词。同一行内的多条语句用分号相隔独占一行的语句则以换行符分隔。
1、 模式鈳以用正则来控制 2、 模式可以用条件表达式来控制 3、 操作是在大括号中的执行内容用分号隔开。 4、 当多条操作不在同一行时可以换行進行操作
说明:如果在输入文件中匹配Tom模式内容,则打印Tom模式所在的记录如果没有显式的指定操作,默认操作是打印文本行等价于命囹; 说明:如果第三字段小于4000,则打印该记录这里用的就是条件表达式。
说明:该操作用来打印employees 文件中所有记录的前两个字段
说明:洳果记录中包含模式Tom,就会打印出Hello there并且在该内容最后加入记录的第一字段内容。模式可以用正则来进行匹配
  • awk的正则表达式是置于两个斜杠之间的,由字符串组成的模式
  • awk默认支持扩展正则表达式
  • awk对正则表达式进行条件匹配,如果条件成立则打印与正则表达式匹配的记錄
  • awk不支持基础正则表达式
  • awk的正则表达式表请自行参考其他文档;参考文档:
运算符 含义        示例
== 等于        x == y
!= 不等於       x != y
~ 与正则表达式匹配  x ~ /y/
 
说明:打印datafile文件中第五字段包含'.'(句点),后面跟一或者多个7~9之间的数字 说明:如果某条记录嘚第二字段不含模式E,则打印该记录的第一字段隔一个空格在打印第二个字段。 说明:如果第三个字段以模式Joel开头则打印该字段,并苴在后面跟上字符串"is a nice guy."注意,如果要打印空格就要把它包括在字符串中。 说明:如果第八个字段以两个数字结尾则打印该字段。 说明:如果第四个字段以Chin结尾则打印双引号间的字符串("The price is $.")、第八个字段和最后那个只有一个句点的字符串。
说明:默认的输入字段分隔符昰空白符本例按照默认分隔符打印第一字段。 说明:以冒号为分隔符打印第一字段。 说明:因为字段以分隔符被设为冒号所以每条記录的字段数变成了7. 说明:使用awk命令,可以用正则表达式来指定多个字段分隔符空格或者冒号将被指定为是字段分隔符。本例中打印头兩个字段(中括号必须在引号内以防shell将他们解释成shell元字符)。

范例1使用了下面的datafile文件

1、如果记录以模式north开头,则打印头3个字段 2、如果记录以模式south开头,则依次打印字符串The第一个字段的值和字符串district。 3、-f选项后面跟的是awk脚本文件名接下来的那个参数是要处理的输入文件名。
1、打印所有的电话号码 2、打印Dan的电话号码 3、打印Susan的姓名和电话号码 4、打印所有姓以D开头的姓氏 5、打印所有以C或者E开头的全名 6、打印所有只包含4个字符的名 7、打印所有区号为916的人的名字 8、打印Mike的资助金额每一个值要使用美元符开头,例如:"$250" 9、打印所有的姓,后面跟┅个逗号和名 10、编写一个名为facts的脚本完成下列工作 a、打印所有姓氏为Savage的人的全名和电话号码 b、打印Chet的资助金额 c、打印所有在第一个月资助叻250美元的人
说明:条件表达式1($1<$2)可以用小括号括起来也可以不括;条件表达式1之后接表达式2,表达式2是赋值;当条件表达式1成立则执荇表达式2的内容否则执行冒号后面的表达式3的内容,这里的赋值与判断需要结合awk的比较表达式
需要注意的是,三目运算在打印条件表達式里面的内容时候变量不需要加美元符,即$
  • 复合模式就是将两个表达式进行逻辑运算
  • 逻辑操作符用来测试表达式或者模式的真假。
  • 邏辑操作符&&表示逻辑与当所有表达式都成立时,模式为真;有一个表达式不成立模式都为假。
  • 逻辑操作符||表示逻辑或当所有表达式Φ有一个成立时,模式为真;当所有表达式全部不成立模式为假。
  • 逻辑操作符!表示逻辑非表示当表达式不成立时,模式为真
说明:awk会打印同时满足$1大于0及$3等于0的行,其他行并不会打印 说明:awk会打印$2等于2或者$1大于1的行;第一记录中的第二字段值为2所以可以被打印;苐二记录中的第一字段大于1所以也能被打印。 说明:如果第八个字段等于13!就对表达式取反,并取消打印操作!是一元否定操作符。

概述:范围模式先匹配从一第一个模式的首次出现到第二个模式的首次出现之间的内容然后匹配从第一个模式的下一次出现到第二个的丅一次出现,以此类推如果匹配到第一个模式而没有发现第二个模式,awk就将显示从第一个模式首次出现的行到文件末尾之间的所有行

awk將显示从Tom首次出现的行到Suzanne首次出现的行的这个范围内的所有行,包括这两个边界在内如果没有找到Suzanne,awk将继续打印各行直至文件末尾如果打印完Tom到Suzanne的内容之后,又出现了Tomawk就又一次开始显示行,直到找到下一个Suzanne或文件末尾
a、 显示/etc/passwd文件,并且通过管道将内容输入到awk程序 b、 awk通过选项-F改变FS变量的默认值

下面所有例子请使用该文件内容:

2、如果第七字段等于5就打印该记录

3、如果第二字段等于字符串"CT",就打印它嘚第一字段和第二字段字符串必须加引号。

4、如果记录的第七字段不等于数字5就打印该记录

5、如果记录的第七个字段值小于5,就打印怹的第四和第七字段

6、如果记录的第六字段大于.9就打印他的第一字段和第六字段

7、如果记录的第八字段小于等于17,就打印该记录

8、如果記录的第八字段大于或者等于17则打印该字段

9、如果第八个字段等于13,就对表达式取反并取消打印操作。

10、如果记录中包含正则表达式southern就将第五字段的值与10相加,并打印结果注意,以浮点数形式表示

11、如果记录中包含正则表达式southern,就将第八字段的值和10相加并打印結果。

12、如果记录中包含正则表达式southern就将10.56与第五字段的值相加并显示计算结果。

13、如果记录中包含了正则表达式southern就用第八个字段减去10,并显示计算结果

14、如果记录中包含了正则表达式southern,就用第八个字段除以2并显示计算结果。

15、如果记录中包含了正则表达式northeast就用第仈个字段除以3,并显示计算结果

16、如果记录中包含了正则表达式southern,就用第八个字段乘以2并显示计算结果。

17、如果记录中包含了正则表達式northeast就用第八个字段对3进行取余,并显示计算结果

18、如果记录中第三字段以Susan开头的内容,就打印Percentage:加第六字段内容并且对第六字段加.2,接着输出Volume:并且在后面加入第八字段的内容

19、从正则表达式western开始的记录,到正则表达式eastern开始的记录这个范围内的所有记录都打印出來。如果之后又发现western开始的记录则再次打印记录至eastern结束的记录或者文件的末尾行。

20、如果记录中的第七字段大于4print函数就输出问号后面嘚这个表达式,否则print函数输出的就是冒号后面的那个表达式

21、如果记录的第三个字段等于字符串"Chris",操作就将"Christian"赋给第三个字段然后显示該记录。双引号检查它的操作数是否相等而单引号则用于赋值。

22、如果找到正则表达式Derek就将第八个字段加上12,并将结果赋值给第八字段并显示这个运算的另一种方式是:$8=$8 + 12

23、对每一条记录执行如下操作:将第七个字段除以三,然后将余数赋给第七字段并显示。

根据datafile文件内容进行操作:

1、打印在第二个月捐款超过100美元的人的姓和名

2、打印在最后一个月捐款少于85美元的人的姓名和电话号码

3、打印第二个月捐款额在75~150美元之间的人

4、打印这三个月的捐款总额不超过800美元的人

5、打印月均捐款额大于200美元的人的姓名和电话号码

6、打印不在916区的人的姓

7、打印每条记录并在记录前加上其记录号

8、打印每个人的姓名和捐款总额

9、把Chet第二个月的捐款额加上10

  • awk变量跟linux变量类似,分为内置变量與自定义变量;
  • awk自定义变量根据变量内容可以分为:数值变量和字符串变量
  • awk程序中提到的内容变量就开始存在。变量可以是一个字符串或者数字,也可以是两者的结合
  • awk变量被设置之后,就变成与右边那个表达式相同的类型或者值
  • awk自定义变量在打印的时候不需要在前媔美元符。
  • awk未经初始化的变量值只能是0或者""究竟是哪个则取决于它们被使用时的上下文。name = "Nancy" name是字符串变量Nancy是字符串变量内容,Nancy一定要用雙引号引起来否则name被视为是空串;x++ x是数字,它的初始化为0然后+1;number = 35 number是数字,数字可以不用双引号

注意:所有由split函数创建的字段或者数组え素都被视为字符串除非它们只包含数字值。如果某个字段或者数组元素为空它的值就是空串。空行也可以被视为空串

  用户自萣义变量的变量名可以由字母、数字的下划线组成,但是不能以数字开头awk的变量不用声明其类型,awk可以从变量在表达式中的上下文推导絀它的数据类型如果变量未被初始化,awk会将字符串初始化成空串将数值变量初始化成0。必要时awk会将字符型变量转化成数值型变量,戓者反向转换下面是对变量赋值的运算符:

运算符 含义 等效表达
 

最简单的赋值方式是求出表达式的效果,然后将其赋值给变量格式如丅:

说明:awk将扫描第一个字段中包含Tom的行。如果发现某一行符合条件就将其第二字段与第三字段相乘,并且将结果赋值给wage由于乘法是算数运算,所以awk会将wage的默认值初始化为0.

  递增和递减运算符:如果要将操作数加1可以使用递增运算符。表达式x++等价于x=x+1。类似的递減运算符则使操作数减少1。表达式x--等价于x=x-1当进行循环操作时,如果只需要递增或者递减一个计数器这种运算符就很有用了。递增和递減运算符可以放在操作数的前面如++x;也可以置于操作数后面,如x++用于赋值语句时,这两个运算符的位置不同可能会造成运算结果的差異

说明:上面这个例子中的++称为后递增运算符,y被先赋值1然后x才+1,这样当运算做完之后y=1,而x=2.
说明:上面这个例子中的++称为先递增运算符先将x+1,然后才将值2赋给y这样当运算做完之后,y=2而x=1. 命令行上的用户自定义变量:可以在命令行上对变量赋值,然后将其传递给awk脚夲下面对awk内置变量进行描述
常用内置变量名  含义
FILENAME    当前输入文件的文件名
FNR       当前文件的记录数
FS        輸入字段分隔符,默认为空格
OFS       输出字段分隔符
RS       输入记录的分隔符
ORS       输出记录分隔符
NF       当湔记录中的字段数
NR       目前的记录数
OFMT      数字的输出格式
IGNORECASE  IGNORECASE为非0值则在正则表达式和字符串匹配中不区分大小写
ARGC   命令行参数的目录
ARGIND  命令行中当前文件在ARGV内的索引(仅用于gawk)
ARGV   命令行参数构成的数组
ENVIRON 包含当前shell环境变量值的数组
FIELDWIDTHS  输叺字段宽度的空白分隔字符串
RLENGTH    match函数匹配到字符串的长度
RT       记录终结符,对于匹配字符或者用RS指定的regexgawk将RT设置到输入攵本
SUBSEP     数组下标分隔符
RSTART     match函数匹配到的字符串的偏移量

字段变量:字段变量可以像用户定义的变量一样使用,唯一的区別是它们引用了字段新的字段可以通过赋值来创建。字段变量引用的字段如果没有值则被赋值为空串。字段的值发生变化时awk会以OFS的徝作为字段分隔符重新计算$0变量的值。字段数目通常被限制在100以内

说明:如果不存在第五字段,awk将创建它并将表达式1000*$3/$2的结果赋给它如果存在第五字段,就直接将表达式的结果赋值给它覆盖该字段原来的内容。
说明:如果第四字段匹配字符串CAawk就将其重新赋值为California。双引號是必需的如果没有这对双引号,字符串CA就会被当成一个初始值为空的用户自定义变量
说明:-F选项把字段分隔符设置为冒号。print函数一佽打印出记录号、第一字段、第二字段、最后一个字段($NF表示最后一个字段)
说明:-F选项把字段分隔符设置为冒号。若awk的内置变量IGNORECASE为非0徝则在正则表达式和字符串匹配中不区分大小写。接着字符串mary adams匹配。最后print函数一次打印出记录号、第一字段、第二字段和最后一个芓段。

  BEGIN模式后面跟了一个操作块awk必须在对输入文件进行任何处理之前先执行该操作块。实际上不需要任何输入文件,也能对BEGIN块进荇测试因为awk要执行完BEGIN操作块后才开始读取输入。BEGIN操作常常被用于修改内部变量(OFS、RS、FS等等)的值、为用户自定义变量赋值和打印输出的頁眉或者标题命令格式如下

在处理输入文件之前,awk先把字段分隔符设为冒号把输出分隔符设为制表符,还把输出记录分隔符设为两个換行符如果BEGIN的操作块中有两条或者两条以上语句,必须用分号分隔它们或每行只写一条语句 awk将显示MAKE YEAR。awk打开输入文件之前先执行BEGIN之后的操作块即使没有指定输入文件,awk也照样打印MAKE YEAR调试awk脚本时,可以先测试好BEGIN块的操作再编写程序的其余部分。

  END模式不匹配任何输入荇而是执行任何与之关联的操作。awk处理完所有输入行之后才处理END模式内容命令格式如下

awk处理完整个文件后才开始执行END块。此时NR值是最後这条记录的记录号 每遇到一个包含Mary模式的行,用户自定义变量count的值就加1awk处理完整个文件后,END块打印字符串Mary was found后面再跟上count的值和字符串times。

  输出重定向:将awk的输出重定向到文件时会用到shell的重定向操作符。重定向的目标文件必须用双引号引起来如果使用的重定向操莋符为> ,则文件被打开并且被清空文件一旦被打开,就会保持打开状态知道awk程序的退出。此后print语句的输出都将追加到文件尾部符号>>吔用于打开文件,但是是附加并不是覆盖,它只向文件尾部追加内容

说明:如果记录的第四个字段的值大于或者等于70,就将它的第一芓段和第二字段的值到覆盖passing_file中 输入重定向:函数getline用于从标准输入或者管道或者文件读取输入。getline函数用于读取下一输入行并且设置内置變量NF、NR和FNR。如果读到一条记录函数就返回1,如果读到EOF则返回0。如果发生错误比如打开文件失败,则getline函数返回-1 说明:先执行linux的date命令,将输出通过管道发给getline再通过getline将传来的内容赋值给用户自定义的变量d,然后打印d 说明:先执行date命令,将输出内容通过管道发送给getline接著getline从管道读取输入,然后保存在用户自定义变量d中split函数从d中生成一个名为mon的数组。最后程序打印出数组mon的第二个元素 说明:ls命令的输絀将传递给getline;每次循环一次,getline就从ls的输出中读取一行并将显示到屏幕。不需要输出文件因为awk会先执行完BEGIN后面的操作块,才读取文件 1、在屏幕上输出What is your name?然后等待用户相应,getline函数将从终端接收输入直到用户换行,然后将输入保存在用户自定义的变量name中 2、如果第一个芓段匹配之前赋给name的值,则执行print函数 3、END语句打印出"See ya,",然后显示Eiile(保存在变量name中的值)再跟上一个句号。 说明:awk将逐行读取文件/etc/passwdlc随之遞增至EOF(最后一行),然后打印lc的值及文件passwd的行数。如果文件不存在getline的值将会是-1。如果读到文件尾部返回值是0,而读到一行时则返回值是1.因此命令"while

  如果在awk程序中打开了管道,就必须先关闭它才能打开另一个管道管道右边的命令包括被括在双引号之间。每次只能打开一个管道

说明:awk使用管道将print语句输出的内容发送给sort命令作为输入。sort命令将以第二个字段为主键、第一个字段为次键对输入进行逆排序这种情况下,sort命令必须被双引号引起来 如果打算再次在awk程序中使用某个文件或者管道进行读写,则可能要先关闭程序因为其中嘚管道会保持打开状态直到脚本运行结束。注意管道一旦被打开,就会保持打开状态直到awk退出因此END块中的语句也受到管道的影响。下媔这个例子中END块的第一行命令将用来关闭管道。 1、awk把输入文件的每一行记录都通过管道发送给sort命令 2、执行到END块时管道被关闭。双引号Φ的字符串必须是最初打开管道的pipe命令字符串完全一致

system函数:awk的内置函数system以unix/linux的系统命令作为参数,执行该命令并且将命令的退出状态返囙给awk程序它很像C语言的一个标准库函数,该函数恰巧也叫system()注意,作为参数的系统命令必须加双引号格式如下:

1、system函数以unix/linux的cat命令和输叺文件的第一个字段作为参数。cat命令把第一个字段的值即一个文件名,作为参数unix/linux shell可以执行cat命令。

本节范例除特别声明外,都使用下媔这个重复出现过多次的datafile文件

范例1:如果记录以正则表达式north开头,则创建用户自定义的变量count然后加1并打印它的值。

范例2:如果记录以囸则表达式north开头则自动递增符将用户自定义变量count加1。然后count的值被打印出来

范例3:第七个字段的值被赋给用户自定义变量x后,自动递减運算符将第七个字段减1该命令会打印出x以及第七个字段的值。

范例5:打印NR的值和$0的值

范例6:如果NR的值在2和5之间则打印记录号和记录本身。

范例7:如果正则表达式以north开头则打印该记录的记录号,后面跟第一字段、第二字段、最后一个字段的值和RS的值由于print函数默认了一個换行,而RS又加了一个换行所以记录的间距会加倍。

范例8:命令行中的字段分隔符被-F选项设置为冒号如果其记录号为5,则打印该记录嘚字段的字段数

范例9:设置print函数的输出格式变量OFMT为:浮点数精确到小数点后两位,然后用新设置的格式打印1.2456789和12E-2这两个数

范例10:第六个芓段和第七个字段的乘积被保存到新的字段$9里面,然后打印出来命令执行之前有八个字段。之后则应该有9个

范例11:每条记录的第十个芓段都被赋值为100,这是一个新字段第九个字段不存在,因而被认为是空字段输出结果是打印记录的字段数,后面跟$9的值和整条记录苐十个字段的值是100。

范例12:BEGIN模式带有一个操作块其操作是在打开输入文件之前打印字符串"-----------EMPLOYEES-----------"。注意本例的命令行并未提供输入文件,但並不影响awk命令的执行因为awk会先执行BEGIN后面的操作块,而不是查找输入文件

范例13:BEGIN操作块最先被执行,于是打出标题"-----------EMPLOYEES-----------"第二个操作块打印輸入文件中的每一条记录。当命令需要换行时可以用反斜杠来取消回车,且在分号或者花括号处进行

范例14:BEGIN操作块被用来初始化变量。变量FS被设为冒号变量OFS被设为制表符。处理完BEGIN操作块中的内容后awk就打开datafile2文件并从中读取记录。如果某条记录以正则表达式Sharon开头则打茚它的第一字段、第二字段、第八字段,输出结果的字符以制表符分隔

范例15:awk处理完输入文件后,就开始执行END后的操作快;打印字符串"The total number of record is "后面跟上NR的值,即最后一行记录的记录号

范例16:如果记录以正则表达式north开头,用户自定义变量count就+1awk处理完输入文件后,打印变量count的值

1、BEGIN的操作块最先被执行;设置字段分隔符为冒号,并且打印输出的表头
2、awk脚本的正文部分包含的语句对来自输入文件的每一行都要执行┅遍操作
3、END操作块中的语句是在输入文件关闭之后即awk退出之前执行。
4、awk程序是在命令行上执行的-f选项后面跟awk脚本文件的名字,再往后則是输入文件名字

范例18:下面的三个范例都使用如下文本内容

printf函数将浮点数的格式设置为:右对齐,总长度为6其中小数点占1位,小数點后面占两位第六个字段的值将四舍五入之后被打印。

范例19:打印一个左对齐、长度为15的字符串第四个字段被打印在两个竖杠之间,豎杠用来标明打印的宽度

范例20:如果记录中包含正则表达式north,则将其第一个字段、第三个字段、第四个字段打印到输出文件districts中文件被咑开后,就保持打开状态直至awk程序退出文件名districts必须加双引号。

1、专用模式BEGIN后跟一个操作块该操作块中的语句最先被执行,且在awk处理输叺文件之前
2、printf函数把字符串NAME显示一个长度为22、左对齐的字符串跟在后面的字符串DISTRICTS则是右对齐。
3、BEGIN操作块结束
4、现在awk开始逐行处理输入攵件。如果在记录中匹配模式west则执行这个操作块,即用户自定义的变量count加1awk在第一次遇到变量count时将先创建它,并赋给它初始值0
5、printf函数鼡于输出格式化并发送给管道。所有输出集齐后被一同发送给sort命令。
6、END操作块起始位置
7、必须用与打开时完全相同的命令来关闭管道,本例中所使用的命令是"sort"否则,END块中的语句将与前面的输出一起被排序

注意:上述脚本跟书上的写法不尽相同,可能是因为awk版本的问題书上的写法无法执行成功。

1、上面这个数据库的记录内容包括姓名、电话号码和近3个月的捐款数额编写一个能产生如下输出的awk脚本。

循环的功能是:当测试表达式的条件为真时重复执行表达式后面的语句。循环常常被用来对记录中的每个字段重复执行某种操作或鍺在END块中用来循环处理某个数组中的所有元素。
awk有三种类型的循环:while循环、for循环和特殊for循环

  使用while循环的第一步是给一个变量初始值嘫后在while表达式中进行测试该变量。如果求得表达式的值为真(非0)则进入循环体执行其中的语句。如果循环体内有多条语句就必须用夶括号把这些语句括起来。循环块结束之前一定要更新用来控制循环表达式的变量,否则循环将无休止地进行下去下面这个例子中,烸处理一条新记录循环控制变量就会被重置一次。do/while循环与while循环很相似唯一的区别在于do/while要先执行循环体至少一次,然后才测试表达式

變量i被初始化为1;当i小于或者等于记录的字段数时,先执行print语句然后将i加1。接下来又重新测试表达式直至i大于NF的值。变量i要在awk开始处悝下一条记录时被重置

  for循环和while循环基本相同,只不过for循环的小括号中需要三个表达式前两个分别是初始化表达式和测试表达式,苐三个则用于更新测试表达式所用的变量在awk的for循环中,小括号里的第一条语句只能初始化一个变量

变量i被初始化为1,然后测试它是否尛于或者等于记录的字段数若是,则print函数便打印出NF和$i的值然后将i加1(for循环经常会在END操作中与数组一同使用,循环处理数组的所有元素)

break:在某个特定条件为真时,使用break语句跳出循环
continue:在特定条件为真时,让循环跳过continue后面的语句将控制转回循环顶部,开始下一轮循環

1、如果字段$x的值小于0,则break语句将控制跳转到循环体的右大括号后面的那条语句即跳出循环。 2、如果字段$x的值等于0则continue语句使控制转囙循环顶部并开始执行,将从for循环的第三个表达式x++开始

  next语句从输入文件中取出下一行,然后awk脚本的顶部重新开始执行

说明:如果某一行的第一个字段包含Peter,awk就跳过该行从输入行中读取下一行,然后从头开始执行脚本

  exit语句用于终止awk程序。它只能中断记录的处悝不能跳过END语句。如果exit语句的参数是一个0~255之间的数这个值就会被打印在命令行上,以表明程序是否执行成功并且指出失败的类型。

說明:退出状态为0表示成功退出状态非0则表示失败。退出状态由程序员决定是否在程序中提供在这个例子中,命令返回的退出状态值為1
  • 数组在awk中被称为关联数组,因为它的下标既可以是数字也可以是字符串下标通常又被称作键(key),并且与对应的数组元素的值相关联數组元素的键和值都存储在awk程序内部的一个表中,该表采用的是散列算法正是由于使用了散列算法,所以数组元素不是顺序存储的如果将数组的内容显示出来,元素的排列顺序也许跟想象中的不一样
  • 数组和变量一样,数组也是被用到时才被创建而且awk还能判定这个数組用于保存数字还是字符串。根据使用时的上下文环境数组元素被初始化为数字0或者空字符串。数组的大小不需要声明awk数组可用于从記录中收集信息,也可用于统计总数、计算词数、记录模式出现次数等应用
1、数组name的下标是用户自定义的变量x。运算符++表明这是一个数徝型的变量awk将x初始化为0,并且每次使用x后将其加1每条记录的第二字段都将赋值给数组name中的相应元素。END块使用for循环来处理数组将从下標0开始,依次打印数组元素的值下标只是一个键,所以不必从0开始下标可以从任意值开始,数字或者字符串都可以 2、awk变量NR保存当前記录的记录号。本例用NR作为下标把每条记录的第三个字段赋值给数组中的相应元素。最后for循环对数组进行循环处理,打印出保存在数組中的值

  当下标为字符串或者非连续的数字时,不能用for循环来遍历数组这个时候就要用特殊for循环。特殊for循环把下标作为键来查找與之关联的值格式如下:

1、如果在输入行的行首匹配到正则表达式Tom,就为数组name赋值一个NR值将作为name数组的索引。在每一行上匹配到Tom时name數组就赋一个第一个字段的值。当达到END块时name数组仅包含name[1]、name[5]、name[6]、name[8]这四个元素。因此当使用for循环打印name数组的值时,索引2、34、7为空 2、用特殊for循环遍历数组,只打印有相应下标的元素的值打印结果的次序是随机的,因为关联数组是以散列方式存储的

数组下标可以是包含單个字符或字符串的变量组成,如果是字符串则必须用双引号引起来。

2、同样的过程被应用与count["mary"]注意,每次只会算一次即便tom或者mary在该荇中出现多次。 3、END模式打印出每个数组元素的值

用字段的值作为数组的下标

  任何表达式都可以用数组的下标。所以也可以用字段莋下标。如下范例中程序用计算所有名字在第二字段出现的次数并引入了一种for循环的新模式。在之前介绍的例子中END块中出现的for循环的笁作过程如下:变量name被设为count数组的索引值,在每次for循环的迭代中执行print操作,首先打印的是索引值然后是保存在元素中的值(打印输出嘚次序是无法确定的)。

1、这条awk语句首先用记录的第二个字段作为数组count的下标数组的下标随第二个字段的变化而变化,所以数组count的第一個下标是Tom而count["Tom"]中保存的值是1。
数组dup的下标是第二个字段的值即人名。dump数组中元素的值最初都是0每处理一条记录,相应元素的值就加1洳果名字重复出现,则对应该下标的元素值就会变成2并相应的逐渐增加。如果dup数组中某个元素的值大于1就会创建一个名为name的新数组,吔是第二个字段的值作为下标用于记录出现次数大于1的人名。

  awk的内置函数split能够将字符串拆分为词然后保存在数组中。您可以指定芓段分隔符也就是FS的值。格式如下

split(字符串数组,字段分隔符)
 

将字符串3/15/2004保存到数组date中用正斜杠作为字段分隔符。现在date[1]中是3date[2]中15,而date[3]中則是2004字段分隔符用3个参数指定,如未指定就是以FS的值做字段分隔符。

delete函数用于删除数组元素

赋给数组line的值是第二字段的值。所有记錄都处理完后特殊for循环将遍历数组的所有元素,并且由delete函数来删除它们

awk虽然没有宣称支持多维数组,却提供了定义多维数组的方法awk萣义多维数组的方法是把多个下标串成字符串,下标之间用内置变量SUBSEP的值分隔变量SUBSEP的值是"\034",这是一个不可打印的字符,极少被使用因此鈈太可能被用作下标中的字符。表达式matrix[2,8]其实就是数组matrix[2 SUBSEP 8]转换后所得的结果为matrix["2\0348"]。因此下标成了关联数组中的唯一标识。

1、将NF的值赋给变量nf 2、进入for循环依次把输入行每个字段的字段号保存到变量x中。 3、matrix是一个二维数组每个字段的值将赋给下标为NR和x的数组元素。 4、END块中的两個for循环被用来遍历matrix数组并且打印数组中保存的值。这个例子只是用来说明如何使用多维数组

ARGV:awk可以从内置数组ARGV中得到命令行参数,其Φ包括命令awk但所有传递给awk的选项都不在其中。ARGV数组的下标从0开始
ARGC:ARGC是一个包含命令行参数个数的内置变量。

for循环先将i设为0然后测试咜是否小于命令行参数的个数(ARGC),再用printf函数依次显示出每个参数所有参数处理完之后,最后那条printf语句用来输出参数的个数ARGC这个例子说明awk並不把命令行选项视为参数。
和上个例子一样打印出所有参数。awk命令被当成第一个参数而-f选项和脚本文件名则被排除在外。
2、Peter Pan被打印絀来了但是,处理完datafile并将其关闭后awk试图把Peter Pan作为输入文件打开。awk把参数都作为输入文件
awk把ARGV数组的元素作为输入文件。且awk用完一个参数僦将它左移接着处理下一个,知道ARGV数组边控如果某个参数使用后立刻被删除,那么这个参数就不会被当做下一个输入文件来处理

  sub函数用于在记录中查找能够匹配正则表达式的最长且最开做的子串,然后用替换串取代找到的子串如果指定了目标串,就在目标船中查找能够匹配正则表达式的最长且最靠左的字串并将找到的字串替换为替换穿,若未指定目标串则在整个记录中查找。格式如下:

sub (正則表达式替换串);
sub (正则表达式,替换串目标串);
gsub (正则表达式,替换串);
gsub (正则表达式替换串,目标串);
1、在记录$0中第一次匹配到正则表达式Mac时Mac被替换成字符串MacIntosh。sub函数只对每行中出现的第一个匹配字符串进行替换 2、在记录的第一个字段中第一次匹配到正则表达式Mac时,Mac被替換成字符串MacIntoshsub函数值对目标串中出现的第一个匹配字符串进行替换。gsub函数则对字符串中的正则表达式进行全局替换即替换所在记录$0中出現的正则表达式。
1、记录$0中找到的每一个正则表达式CA都被替换为California 2、在第一个字段中找到的每个正则表达式Tom或者tom都被替换为Thomas。

index函数返回子串在字符串中第一次出现的位置偏移量从位置1开始计算。格式如下:

返回的数字是子串low在字符串hollow中第一次出现的位置偏移量从1开始计算。

length函数返回字符串中字符的个数如果未指定参数,则length函数返回记录中的字符个数格式如下:

length函数返回字符串hello的字符个数。

substr函数返回從字符串指定位置开始的一个子串如果指定了子串的长度,则返回字符串的相应部分如果指定的长度超出了字符串的实际范围,则返囙其实际内容格式如下:

在字符串"Santa Claus"中,打印从位置7开始、长度为6个字符的字串

match函数返回正则表达式在字符串中出现的位置,如果未出現则返回0。match函数把内置变量RSTART设为子串在字符串中的起始位置RLENGTH则设为子串的长度。这些变量可以被substr函数用来提取相应模式的字串(只可用於nawk)格式如下:

正则表达式/A-Z+$/的意思是查找在字符串尾部连续出现的大写字母。找到的子串USA是从字符串"Good ole USA"的第十个字符开始的如果字符串未能匹配到正则表达式,则返回0
1、变量RSTART被match函数设置为匹配到的正则表达式在字符串中的起始位置。变量RLENGTH则被设为字串的长度 2、substr函数在变量line中查找子串,把RSTART和RLENGTH的值作为子串的起始位置和长度

split函数使用由第三个参数指定的字段分隔符,把字符串拆分成一个数组如果没有提供第三个参数,awk将把FS的当前值作为字段分隔符格式如下:

split (字符串,数组字段分隔符)
 
split函数把字符串12/25/2001拆分为数组date,以正斜杠作为字段分隔苻数组date的下标从1开始。awk将打印数组date的第二个元素

sprintf函数返回一个指定格式的表达式。可以在sprintf函数中使用printf的格式规范格式如下

按照printf的规范设置第一个和第三个的字段。结果被赋给用户自定义的变量line

整数函数(int函数)

int函数将社区小数点后面的所有数字,生成一个整数int函数不執行四舍五入操作。

1、END块将除法运算的结果打印成浮点数形式 2、END块中的int函数把除法运算的结果从小数点开始社区,显示的结果是一个整數

随机数生成器(rand函数)

rand函数生成一个大于或者等于0、小于1的伪随机浮点数。

每次运行程序都打印出同一组数字可以用srand函数可以为rand函数的種子设一个新值,否则如上例所示,每次调用rand都只会重复出现同意数列

srand函数如果未指定参数,srand函数会根据当前时刻为rand函数生成一个种孓srand(x)则把x设置成种子。通常程序应该在运行过程中不断的改变x的值。

srand函数为rand设置了一个新种子起点是当前时刻。因此每次调用rand都打茚出一组新的数列。
strand 函数为rand设置了一个新种子起点是当前时刻。rand函数在0~25之间选出一个随机数然后将其化为整数。

自定义函数(nawk)

脚本Φ凡是可以出现模式操作规则的位置都可以放置用户自定义的函数格式如下:

函数名(参数,参数){
(注意:return语句和表达式都是可选项)
 

  变量以参数值的方式传递且仅在使用它的函数中局部有效。函数使用的只是变量的副本数组则通过地址或者引用被传递,因此可以在函数中直接修改数组的元素。函数中的任何变量只要不是从参数列表中传来,就都会被视为全局变量也就是说,该变量对整个awk程序都昰课件的而且,如果它在>函数中发生了改变即在整个程序中发生了改变,在函数中提供局部变量的唯一途径就是将它们加入参数列表Φ这类参数通常放在参数列表的末端。当条用函数时如果没有指定某个形参的值,该参数就会被初始化为空return语句会把控制权交还给調用者,可能还会返还一个值

1、定义名为soft的函数。函数定义可以出现在脚本的任意位置除了那些作为参数传递的变量外,所有其他变量的域都是全局的即如果在函数中发生了变化,也就是在整个awk脚本中发生了变化数组是通过引用进行传递的。小括号中共有5个形参其中:数组scores将通过引用被传递,所以如果在函>数中修改了这个数组中任何一个元素,原来的数组也会被修改变量num_elements是一个局部变量,是原变量的一个副本变量temp,j和i则是函数的局部变量 2、外层的for循环将遍历一个证书数组,前提是该数组中至少有两个整数可用于比较 3、內层的for循环用当前这个整数与数组中前一个整数(scores[j-1])进行比较。如果前一个整数大于当前这个整数就把当前这个数组元素的值赋给变量temp,然后把前一个元素的值赋给当前元素 4、外层循环至此结束。 6、脚本的第一个操作块由此开始for循环遍历当前记录的所有字段,生成一個整数数组 7、调用sort函数,把由当前记录生成的整数数组和当前记录的字段数作为参数传给它 8、sort函数结束后,程序控制由此开始这个for循环用于打印完成排序的数组中的元素。

如果没有特别说明本节范例都将使用下面的datafile数据库。

范例1:if语句属于操作语句如果表达式后面嘚语句不止一条,就必须用大括号将它们括起来这个表达式的含义是:如果第八个字段大于15,则打印第三个字段和字符串"has a high rating",否则就打印第彡个字段和字符串"---NOT A COMPETITOR---"

 

范例2:用户自定义变量i被赋值为1。awk进入while循环开始测试表达式。如果表达式值为真就执行print语句,打印第i个字段的值然后将变量i的值加1,再次进入循环当i的值大于NF且NR为2或者更大的值时,循环表达式的值就会变为假变量i的值会在开始处理下一条记录時被重新初始化。

范例3:for循环在功能上类似于while循环它把初始化、测试和循环控制语句都放在一个表达式里面。for循环先为当前记录初始化┅次i的值(i=3)然后测试表达式。如果i小于或者等于NF且NR等于3,则执行print块打印第i个字段的值之后,控制就转回循环表达式将i的值加1,嘫后再次执行测试

范例4:数组list以NR作为下标的值。每处理一行输入都将其第一个字段赋值给数组list。END块中的for循环对每个数组元素执行遍历囷打印操作

范例5:每次在输出行中发现正则表达式north时,都把该行的第三个字段赋给数组name每处理一条新纪录,数组的下标count都被加1于是苼成一个新的数组元素。然后END块采用一个特殊的for循环来遍历该数组。

范例6:数组region以第一个字段作为下标它保存的值是每个区的出现次數。然后END块用一个特殊的for循环来遍历并且打印region数组。

上面这个数据库的记录包括姓名、电话号码和最近三个月的竞选捐款数额请编写┅个能产生如下输出的awk脚本。

有些数据(比如从磁带或者电子表格)可能没有明显的字段分隔符却有固定宽度的列。预处理这类数据时substr函數很管用。

下面这个例子中字段都是固定宽度的,但没有使用字段分隔符substr函数可以用来创建字段。

第一个字段通过从整个记录中提取孓串得到子串从记录第一个字段开始、长度为6个字符。接下来打印一个空格。第二个字段是通过在记录中提取从位置7开始、长度为6个芓符的子串得到后跟一个空格。最后一个字段则是通过在整个记录中提取从位置13开始、到由行的长度所确定的位置之间的子串获得

如果用固定长度的字段来存储数据,就可能出现一些空字段下面这个例子中,substr函数被用来保存字段而不考虑它们是否包含数据。

1、打印攵件db的内容这个文件中有一些空字段。 2、数组f的第一个元素被赋值为由位置1开始、长度为3的记录的子串 3、数组f的第二个元素被赋值为甴位置5开始、长度为3的记录的子串。 4、数组f的第三个元素被赋值为由位置9开始、长度为3的记录的子串 5、用sprintf函数设置好数组元素的格式,嘫后将它们赋值给用户自定义的变量line 6、打印line的值,可以看到结果中空字段依然被保留

带$、逗号或者其他字符的数字

下面这个例子中,價格字段中包含一个美元符号和逗号脚本必须删除掉这些字符,才能把价格加起来得出总的开销可以通过gsub函数来完成这一任务。

第一個gsub函数用空字符串对美元符号进行全局替换;第二个gsub函数则用空串替换全部逗号然后,将用户自定义变量cost与每行的第七个字段相加再紦每次的结果赋回给cost,由此统计出总数END块打印出字符串"The total is $",后面跟着cost的值。

到目前为止本书用作例子的所有数据文件中,每条记录都自成┅行而在下面这个名为checkbook的示例数据文件中,记录之间用空行分隔统一记录的字段之间则用换行符号分隔。要处理这个文件就必须将記录分隔符设为空值,而把字段分隔符设为换行符

1、在BEGIN块中,记录分隔符RS被赋值为空字段分隔符被设为换行符,输出记录分隔符ORS则被設置为两个换行符语句,每一行都是一个字段且输出记录之间有两个换行符将其分隔。 2、打印记录号后跟记录的每个字段。

Language中的一個程序其复杂之处在于对正贼处理的数据进行记录。输出文件的名称是data.form他只是包含数据,文件中的字段由冒号分隔另一个文件叫做form.letter,其内容是用于生产信函的实际格式这个文件由getline函数加载进入awk的内存空间。格式信函的每一行都被保存在一个数组中这个程序从data.form中读取数据,用实际数据替换form.letter中以#和@开头的特殊字符串从而生成信函。临时变量temp保存了数据替换完成后要显示的实际的行内容。这个程序鈳以用来为data.form中列出的每个生成一封个人信函

1、在BEGIN块中,字段分隔符被设置为冒号用户自定义变量n被设置为1. 2、在while循环中,getline函数逐行读入攵件form.letter如果没有找到指定文件,getline就会返回-1.读到文件末尾时getline返回。因此只要测试getline的返回值是大于0就能知道该函数是否从输入文件中读出┅行数据。 4、unix命令date的输出被管道发给getline函数并赋值给用户自定义变量d。然后split函数用空格拆分变量d,生成一个名为today的数组 5、把数组today中月、日、年的值赋值给用户自定义变量thisday。 7、for循环将要循环n次 8、从数组form中读取一行并赋值给用户自定义变量temp。 9、这个嵌套的for循环将对来自输叺文件data.form的记录执行NF次循环在变量temp保存的每一行中查找字符串"@date",如果匹配,就用gsub函数把它替换成当天的日期 10、如果在temp保存的行中发现了字苻#和一个数字相连,gsub函数就将#和这个数字替换为输入文件data.form中相应字段的值例如,如果测试的对象是第一行则#1将替换为Dynamo,#2将替换为John Stevens#3替換为Dana Smith,#4替换为4/12/2001以此类推。 11、替换后对temp中国存储的行进行打印。

我们已经知道了awk是如何工作的同时也了解到编写shell脚本时,awk将是一个非瑺强大的工具你可以在shell脚本中切入单行的awk命令或者awk脚本。下面就是一个切入了awk命令的Korn shell程序

1、把unix命令cal的输出通过管道发送给awk。打印输出嘚第一行其中包邮当前的月份和年份。 2、awk脚本form.awk生成的格式信函被重定向到一个unix文件

(参见从本书合作站点下载的文件名中名为lab7.data的数据库攵件)

上面这个数据库所记录的内容包括姓名、电话号码和最近3个月的竞选捐款数额。请编写一个用户自定义函数要求该函数能返回指定朤份的人均捐款额。月份由用户在命令行输入

本节示例,除特别声明外都是用了下面这个重复出现过多次的datafile文件。

如果这是第一条记錄就将其第一个字段中的正则表达式notrhwest全部替换为southwest。当然前提是第一个字段中有northwest。 如果这是第一条记录就显示其第三个字段中从第一個字段开始、长度为3个字符的子串。显示结果是子串"Joe" 如果这是第一条记录,就打印其第一个字段的长度 如果这是第一个记录,就打印其第一个字段中首次出现子串west的位置字符串west是从字符串notrhwest的第六个位置开始。 如果match函数在第一个字段中找到了正则表达式/^no/就返回最左端那个字符的索引位置。match函数还将内置变量RSTART设置为索引位置将变量RLENGTH设为匹配到的子串的长度。substr函数返回第一个字段中从位置RSTART开始、长度为RLENGTH個字符的子串 字符串10/14/01被炒粉成为数组now。分隔符是正斜杠从第一个元素开始打印数组的所有元素。 输入字段分隔符被设为冒号如果记錄中包含正则表达式north,就用空格作为分隔符将该记录的第一字段拆分为数组name。然后打印数组name的元素 sprintf函数以printf函数的格式规范来设置第七囷第二个字段的格式。接着返回经过格式化的字符串,并将其赋值给用户自定义的变量line然后,变量line被打印出来 toupper函数返回的是一个字苻串。其中所有小写字母均已转换成大写字母,非字母字符不发生变化类似的,tolower也返回字符串但作用于将所有大写字母转换成小写芓母。注意字符串必须加双引号。 gawk提供了两个函数来获取时间和格式化时间戳:systime和strftime systime函数:将返回来自1970年1月1日以来经过的时间(按照秒计算)。 systime函数的返回值被赋给一个用户自定义的变量:now这个值等于从1970年1月1日以来所累计的总时间。 strftime函数使用C库中的strftime函数对时间进行格式化格式形式可以为%T%D等。时间戳的格式和systime函数返回值所采用的格式一样如果不适用时间戳,则以当前的时间为默认时间 strftime函数通过一个参数所給出的格式来设置时间和日期的形式。如果以systime作为第二个参数或者不带第二个参数,使用本地的当前时间如果带了第二个参数,则它必须与systime函数的返回值格式一致 BEGIN块中包含一个for循环,用于处理命令行参数ARGC是参数的个数,ARGV则是包含实际参数的数组awk不把选项当成参数。这个例子中的有效参数只有awk命令和输入文件datafile 1、在BEGIN块中,名字"Derek"被赋给变量name接下来的模式操作块中,name试着将"Derek"作为输入文件打开结果失敗了。 2、把"Derek"赋给变量name后awk就把ARGV[1]删除了。进入模式操作块时awk没有尝试将"Derek"作为输入文件打开,而是打开了文件datafile 将linux的date命令通过管道传给getline函数,结果保存在变量d中并打印出来 将linux的date命令通过管道传给getline函数,结果保存在变量d中split函数将字符串d拆分为数组mon。然后awk打印数组mon的第二个え素。 从终端/dev/tty读取输入保存到数组name中。 用while循环逐行遍历/etc/passwd文件每进入一次循环,都用getline函数读入一行同时将变量lc加1.退出循环后,打印lc的徝,即打印出文件/etc/passwd的行数只要getline的返回值大于0,即读入一行循环就会继续。 如果第五个字段大于4.5就读入输入文件的下一行,并从awk脚本的起点开始处理否则,打印第一个字段 如果记录的第二个字段包含字母S,就打印该记录并且从awk程序退出。C shell的变量status中保存了退出状态洳果是Bourne shell 或者Korn shell,退出状态则保存在变量$? 1、用户自定义变量在BEGIN块中被初始化为0. 2、处理文件中的每一行时,都已$5为参数调用函数max并将其返囙值赋给变量maximum。 3、定义用户自定义函数max函数的语句必须括在大括号中。每次从输入文件datafile中读取新的记录后脚本都会调用max函数。 4、比较num囷largest的值返回其中较大的值。

火爆朋友圈的头脑王者题库来了小伙伴们要想玩好这款益智游戏,一定要熟练掌握下面题库呕:

下面共计134道试题想查看更多头脑王者题目?

1、鳄鱼的哭泣一般是由于?

2、下列那句话鲁迅没说过?

答案:我去对面买几个橘子(此句出自朱自清的《背影》)

3、1799年乾隆皇帝去世同年去世的另外一位美国总统是谁?

4、2008姩在北京举行的是第几届夏季奥林匹克运动会?

5、香山居士是我国古代哪位文学家的别称?

6、骆驼的驼峰是储存什么的?

7、官方曾给米其林轮胎囚「添加」了哪个家庭成员?

8、扑克牌中黑桃Q的人物原型是谁?答案:雅典娜

10、八小时工作制度最早是在那个国家出现的?

11、香奈儿的掌门人“咾佛爷:,本名叫什么?

12、水浒传中108位好汉有几位女人?

13、2017获得的自由泳游泳冠军是?

14、正方体有几块面?

15、英文字母一共有几个?

16、英文字母s后面嘚字母是?

17、“八小时工作制度”最早是在哪个国家出现的?

18、由马云主演的电影《功守道》导演是谁?

解析:《功守道》是由文章执导、编剧李连杰监制,马云领衔主演吴京、甄子丹、邹市明、朝青龙、托尼·贾、向佐、刘承羽等主演

19、黄瓜的另一个名字是什么?

20、骆驼的驼峰是储存什么的?

21、扑克牌中黑桃Q的人物原型是谁?

23、谁罪大滔天,搞到百姓怨声载道?

24、12年TV年度销量霸权是?

25、以下哪项不是虚渊玄的作品?

26、老虛的全名叫什么?

27、哪部动画片的男主角不知道全名?答案:凉宫春日的忧郁

28、Key社有大魔王之称的脚本作家是谁?

29、以下哪部作品和《传说中的勇者传说》是同一个作者?

答案:曾几何时天魔的黑兔

30、“夜阑卧听风吹雨铁马冰河入梦来”是谁的诗句?

31、魔法少女小圆的导演是谁?

32、我國唯一一个具有五种地形的省区是哪里?

33、珍珠港事件后美国航母集群什么轰炸机?

34、动画k-on!的中文名称是什么?

35、以下哪个是微软的产品?

36、宫崎駿唯一获得奥斯卡最佳动画长篇奖项的动画电影是?

37、以下哪家不是显卡厂商?

38、世界上面积最大的岛屿?

39、磁带、硬盘和信用卡都利用了什么特性的物质来作储存数据?

答案:低磁滞损失的铁磁性物质

40、索尼的第一部游戏主机playstation是在哪一年推出的?

41、以下哪种视频容器格式可封装的轨噵数最多?

42、一战中最先使用毒气弹的战役是?

43、在1993年Windows95的测试版中的开发版本号是哪一个?

45、大美利坚自由独立的第一枪在哪里打响?

46、国际通用嘚标准音的频率是?

47、下列哪个不是天启四骑士?

48、网页在不重载页面的情况下重绘部分页面的技术叫做什么?

49、以下那个adobe的软件是用于剪辑视頻的?

50、谁证明了地球是圆的?

51、战略大作战这部电影当中,主角们做了啥?

答案:开着谢尔曼抢银行

52、美版恐龙战队的绿衣队员叫什么?

53、《新夲格魔法少女莉丝佳》中莉丝佳使用什么魔法?

54、“耶稣的的晚宴”此绝招出自哪部动漫?

55、《大剑》中史上最强的战士迪妮莎是怎么死的?

答案:被普莉西拉偷袭所杀

56、数码暴龙第一季的主题曲叫什么?

57、《CodeGeass反叛的鲁路修》中日本被不列颠帝国改称为什么?

58、创价学会御本尊(4代目)的sm號是多少?

59、机动战士高达中的牛高型号是?

60、以下哪部作品出品时间最早?

61、下面哪一位不是《天地无用》系列中的三女神?

答案:魉呼(注:鹫羽访希深津名魅都是)

62、被称为"LOL"的游戏是什么?

63、寒蝉里龙宫礼奈惯用的武器是?

65、宏观经济学中的AS指的是什么?

66、《魔法少女小圆》中小圆的配喑是谁?

67、动画《勇者王》里面的GGG正确拼写为?

68、《紫音之王》中谁因为幼年受到惊吓而导致失去了声音?

69、《蔷薇少女》中翠星石的瞳色是?

70、娶妻当如樱庭葵生女当如___?

71、去除掉头和尾巴的马达加斯加蟑螂是什么味道?

72、恶作剧之吻男主角名字是()?

73、《北斗神拳》主角健在师兄弟4人Φ排行第几?

74、《哆啦A梦》中多啦A梦是从什么时代来的?

75、《海贼王》的作者是谁?

76、《新世纪福音战士》中的凌波丽的配音是谁?

77、以下哪一个昰“完全数”?

78、生前川上伦子没有配过哪部动画的角色?

79、“这个时候只要微笑就可以了”这句经典台词出自于那部动画?

答案:《新世纪福喑战士》

80、《我的朋友很少》中邻人部第一次和宿所吃的晚饭是?

82、以下哪一部游戏作品不属于Galgame?

83、动画《神奇宝贝》中基拉祈多少年醒来一佽,并且每次醒来只维持多少天?

84、《暗黑破坏神2》中1秒由多少帧组成?

85、烧红镍球放入水中会有什么现象?

86、“夜阑卧听风吹雨,铁马冰河叺梦来”是谁的诗句?

87、《名侦探柯南》中服部平次是哪里人?

88、与宫崎骏常年合作的著名音乐家是谁?

89、IS中的铃是哪国人?

90、物语系列中忍野忍所拥有的妖刀名号是?

91、俺はGandom(我就是高达)这句话是谁说的?

92、灼眼的夏娜中女主角的刀名字叫?

93、《摇曳百合》中京子喜爱的冰淇淋口味是什么?

94、命运石之门男主角的网名是?

95、以下哪部游戏中没出现东风谷早苗?

96、《CLANNAD》中的冈崎朋也的配音是谁?

97、《火影忍者》中的第五代火影是谁?

98、桂木桂马的协助者是谁?

99、杀手47的后脑勺上有什么?

101、《数码兽大冒险》中第八位被选召的孩子是?

答案:八神光/八神嘉儿

102、雾雨魔理沙的口癖昰?

103、切丝papa的生日在几月几日?

104、为动画《魔法少女小圆》中佐仓杏子一角配音的声优是?

105、“月有阴晴圆缺”用科学的观点看待这件事,原洇是?

答案:地球绕太阳转动月球绕地球转动,两者转速不一样出现偏角,使地球掩住了月球的一部分

106、《我的朋友很少》中井上麻裏奈为哪个角色配音?

107、游戏《生化危机1》的第一女主角是谁?

108、回转企鹅罐中一共有多少个ED?

答案:出了多少个OST10,8

109、身为纯爷们绝对从不回頭看什么?

110、以下哪一位不是《最终幻想:零式》的CV?

111、《大航海时代2》阿兰的特长是什么?

112、钢之炼金术师FA中角色张梅身边总跟着一只什么動物?

114、幽灵行军不是谁的固有结界?

115、初音未来的音源提供者是哪个声优?

116、著名电子游戏《上古卷轴》是由哪家公司开发的?

117、石蕗惠汰羽瀨川小鹰,须贺京太郎大路饼藏四人的共同点包括

118、在Mugen中,最高的人物等级是?

119、圣斗士星矢的看家技能是?

120、魔兽世界里的联盟英雄吉安娜是什么职业?

121、谁被称为日本动画界的黑泽明?

122、世界已完蛋”来自于哪部作品OP的空耳?

123、炮姐的最爱是?

124、美少女战士的作者是哪位漫画家的夫人?

125、陈坤在微博向大家推荐了哪部动画得到群众热烈反应?

127、正面上我啊是哪个人物的名台词?

128、为《星际牛仔》《攻壳机动队》《MacrossF》等动畫配乐的著名音乐制作人是?

129、指的是东方project中的那个人物?

130、《天降之物》第一集中从天而降的天使名字是?

131、路过草从最担心的是哪句话?

132、《海贼王》中与路飞同行的一位厨师是?

133、自古枪兵的幸运值是多少?

134、德玛西亚之力此人物出自哪个游戏?

我要回帖

 

随机推荐