awk的使用 第二部分 awk的运行方式
2013-10-15 09:40
337 查看
在linux/UNIX 的命令行上输入一下格式的指令: ( “$”表Shell命令行上 的提示符号)
$awk ‘awk程序’ 数据文件名
上面这条语句中,awk会先编译该程序, 然后执行该程序来处理所指定的数据文件。
awk程序的主要结构: awk程序中主要语法是 Pattern { Actions},即模式{动作}, 所以常见的awk 程序的机构如下:
Pattern1 { Actions1 }
Pattern2 { Actions2 }
……
Pattern3 { Actions3 }
Pattern 是什么? awk 可接受许多不同型态的Pattern。 一般常使用 “关系表达式”(Relational expression) 来当成 Pattern。 例如: x > 34 是一个Pattern, 判断变x与34是否存在大于的关系。 x == y是一个Pattern, 判断变量x与变量y是否存在等于的关系。 上式中 x>34 ,x ==y 便是典型的Pattern。 awk 提供C 语言中常见的关系运算符(Relational Operators) 如 >, <, >=, <=,
==, != 。此外, awk 还提供~ (匹配match) 及 !~(非匹配not match) 二个关系运算符。 其用法与涵义如下:
如果A 为一字符串, B 为一正则表达式(Regular Expression) ,A ~ B 判断字符串A 中是否包含能匹配(match)B表达式的子字符串。 A !~ B 判断字符串A 中是否不包含能匹配(match)B表达式的子字符串。 例如:”banana” ~ /an/ 整个是一个Pattern。 因为”banana”中含有可以匹配/an/的子字符串,所以此关系式成立 (true),整个Pattern的值为true。
有少数awk文章, 把~, !~ 当成另一类的操作符(Operator),而不作为一种 Relational Operator。在这里将这两个运算符当成一种Relational Operator。
Actions 是什么?
Actions 是由许多awk指令构成。awk 的指令与C 语言中的指令十分类似。 例如:awk 的I/O指令: print, printf( ), getline……
awk的流程控制指令:
if(…){…} else{…}, while(…){…}…
awk 如何处理模式和动作的呢?(Pattern { Actions } ? ),awk 会先判断(Evaluate)Pattern的值, 如果Pattern的值为true (或不为0的数字,或不是空的字符串),则awk将执行该Pattern所对应的Actions。否则,如果Pattern之值不为true, 则awk 将不执行该Pattern所对应的Actions。
例如:如果awk程序中有下列两指令 50 > 23 {print “Hello! The word!!” } “banana” ~ /123/ { print “Good morning !” }
awk会先判断50 >23 是否成立,因为该式成立,所以awk将打印出”Hello! The word!!”。 而另一Pattern 为”banana” ~/123/, 因为”banana” 内未含有任何子字符串可匹配(match)/123/,所以Pattern 的值是false,awk将不会打印出 “Good morning !”
awk 如何处理{ Actions } 的语法是什么呢?
有时语法Pattern { Actions }中,Pattern 部分会省略,只剩下 {Actions}。这种情况表示”无条件执行这个Actions”。
awk 的字段变量
awk 所内建的字段变量及其涵意如下:
字段变量 含义
$0 一字符串, 其内容为目前awk 所读入的数据行。
$1 $0 上第一个字段的数据。
$2 $0 上第二个字段的数据
其余类推 。
读入数据行时,awk如何更新(update)这些内建的字段变量?
当awk 从数据文件中读取一个数据行时,awk 会使用内建变量$0 进行记录。当$0 被改动时(例如:读入新的数据行或改变$0的值…), awk 会立刻重新分析$0的字段情况,并将$0上各字段的数据用$1,$2…进行记录。
awk 的内建变量(Built-in Variables)
awk 提供了许多内建变量,使用者可以在程序中使用这些变量来取得相关信息。常见的内建变量有:
内建变量 含义
NF Number of Fields 为一整数,其值表示$0上所存在的字段数目。
NR Number of Records为一整数,其值表示awk 已读入的数据行数目。
FILENAME awk正在处理的数据文件文件名。
例如:awk 从资料文件emp.dat 中读入第一笔数据行“A101 chenying 100 210”之后,程序中:$0 的值就是“A101 chenying 100 210”,$1的值是 “A101″,$2 的值是 “chenying”,$3的值是100,$4的值是210,$NF的值是4,$NR 的值是1,$FILENAME 的值是”emp.dat”。
awk 的工作流程:执行awk 时,它会反复进行下列四步骤:
1、自动从指定的数据文件中读取一个数据行。
2、自动更新(Update)相关的内建变量之值。 如:NF,NR,$0…
3、依次执行程序中所有的Pattern { Actions } 指令。
4、当执行完程序中所有Pattern { Actions } 时,如果数据文件中还有未读取的数据,则反复执行步骤1到步骤4。awk会自动重复进行上述4个步骤,使用者不须于程序中编写这个循环(Loop)。
打印文件中指定的字段数据并加以计算
awk 处理数据时,它会自动从数据文件中一次读取一行记录,并将该数据切分成一个个的字段;程序中可使用$1,$2,…直接取得各个字段的内容。这个特色让使用者轻易地使用awk 编写reformatter 来改变数据格式。
例子:以文件emp.dat 为例,计算每人应发工资并打印报表。
分析:awk 会自行一次读入一行数据,所以程序中仅需告诉awk 如何处理所读入的数据行。执行如下命令:
$ awk ‘{ print $2,$3 * $4 }’ emp.dat
执行结果时,屏幕出现 :
chenying 21000
linxiyu 23650
…………….
linux/UNIX命令行上,执行awk 的语法为:$awk ’awk程序’ 欲处理的资料文件文件名;本例中程序部分是{print $2, $3 * $4}。 把程序置于命令行时,程序之前后须以’ 括住。emp.dat 为指定给该程序处理的数据文件文件名。本程序中使用:Pattern { Actions } 语法,但是Pattern 部分被省略,表无任何限制条件,所以awk读入每笔数据行后都将无条件执行这个Actions。 print为awk所提供的输出指令,会将数据输出到标准输出stdout(屏幕)。
print 的参数间彼此以”,” (逗号) 隔开,打印出数据时彼此间会以空白隔开。
如果将上述的程序部分储存于文件pay1.awk 中,执行命令时再指定awk 程序文件的文件名。 这是执行awk 的另一种方式,适用于程序较大的情况, 其语法如下:
$ awk -f awk程序文件名 数据文件文件名
$ awk -f pay1.awk emp.dat
awk 中也提供与 C 语言中类似用法的printf()函数,使用该函数可进一步控制数据的输出格式。编辑另一个awk程序如下,并取名为pay2.awk
{ printf(“%10s Work hours: %3d Pay: %5d/n”, $2,$3, $3* $4) }
执行下列命令
$awk -f pay2.awk emp.dat
执行结果屏幕出现:
chenying Workhours: 100 and pay: 21000
linxiyu Workhours: 110 and pay: 23650
degnming Workhours: 130 and pay: 27170
liuchao Workhours: 125 and pay: 27500
hejing Workhours: 95 and pay: 19950
$awk ‘awk程序’ 数据文件名
上面这条语句中,awk会先编译该程序, 然后执行该程序来处理所指定的数据文件。
awk程序的主要结构: awk程序中主要语法是 Pattern { Actions},即模式{动作}, 所以常见的awk 程序的机构如下:
Pattern1 { Actions1 }
Pattern2 { Actions2 }
……
Pattern3 { Actions3 }
Pattern 是什么? awk 可接受许多不同型态的Pattern。 一般常使用 “关系表达式”(Relational expression) 来当成 Pattern。 例如: x > 34 是一个Pattern, 判断变x与34是否存在大于的关系。 x == y是一个Pattern, 判断变量x与变量y是否存在等于的关系。 上式中 x>34 ,x ==y 便是典型的Pattern。 awk 提供C 语言中常见的关系运算符(Relational Operators) 如 >, <, >=, <=,
==, != 。此外, awk 还提供~ (匹配match) 及 !~(非匹配not match) 二个关系运算符。 其用法与涵义如下:
如果A 为一字符串, B 为一正则表达式(Regular Expression) ,A ~ B 判断字符串A 中是否包含能匹配(match)B表达式的子字符串。 A !~ B 判断字符串A 中是否不包含能匹配(match)B表达式的子字符串。 例如:”banana” ~ /an/ 整个是一个Pattern。 因为”banana”中含有可以匹配/an/的子字符串,所以此关系式成立 (true),整个Pattern的值为true。
有少数awk文章, 把~, !~ 当成另一类的操作符(Operator),而不作为一种 Relational Operator。在这里将这两个运算符当成一种Relational Operator。
Actions 是什么?
Actions 是由许多awk指令构成。awk 的指令与C 语言中的指令十分类似。 例如:awk 的I/O指令: print, printf( ), getline……
awk的流程控制指令:
if(…){…} else{…}, while(…){…}…
awk 如何处理模式和动作的呢?(Pattern { Actions } ? ),awk 会先判断(Evaluate)Pattern的值, 如果Pattern的值为true (或不为0的数字,或不是空的字符串),则awk将执行该Pattern所对应的Actions。否则,如果Pattern之值不为true, 则awk 将不执行该Pattern所对应的Actions。
例如:如果awk程序中有下列两指令 50 > 23 {print “Hello! The word!!” } “banana” ~ /123/ { print “Good morning !” }
awk会先判断50 >23 是否成立,因为该式成立,所以awk将打印出”Hello! The word!!”。 而另一Pattern 为”banana” ~/123/, 因为”banana” 内未含有任何子字符串可匹配(match)/123/,所以Pattern 的值是false,awk将不会打印出 “Good morning !”
awk 如何处理{ Actions } 的语法是什么呢?
有时语法Pattern { Actions }中,Pattern 部分会省略,只剩下 {Actions}。这种情况表示”无条件执行这个Actions”。
awk 的字段变量
awk 所内建的字段变量及其涵意如下:
字段变量 含义
$0 一字符串, 其内容为目前awk 所读入的数据行。
$1 $0 上第一个字段的数据。
$2 $0 上第二个字段的数据
其余类推 。
读入数据行时,awk如何更新(update)这些内建的字段变量?
当awk 从数据文件中读取一个数据行时,awk 会使用内建变量$0 进行记录。当$0 被改动时(例如:读入新的数据行或改变$0的值…), awk 会立刻重新分析$0的字段情况,并将$0上各字段的数据用$1,$2…进行记录。
awk 的内建变量(Built-in Variables)
awk 提供了许多内建变量,使用者可以在程序中使用这些变量来取得相关信息。常见的内建变量有:
内建变量 含义
NF Number of Fields 为一整数,其值表示$0上所存在的字段数目。
NR Number of Records为一整数,其值表示awk 已读入的数据行数目。
FILENAME awk正在处理的数据文件文件名。
例如:awk 从资料文件emp.dat 中读入第一笔数据行“A101 chenying 100 210”之后,程序中:$0 的值就是“A101 chenying 100 210”,$1的值是 “A101″,$2 的值是 “chenying”,$3的值是100,$4的值是210,$NF的值是4,$NR 的值是1,$FILENAME 的值是”emp.dat”。
awk 的工作流程:执行awk 时,它会反复进行下列四步骤:
1、自动从指定的数据文件中读取一个数据行。
2、自动更新(Update)相关的内建变量之值。 如:NF,NR,$0…
3、依次执行程序中所有的Pattern { Actions } 指令。
4、当执行完程序中所有Pattern { Actions } 时,如果数据文件中还有未读取的数据,则反复执行步骤1到步骤4。awk会自动重复进行上述4个步骤,使用者不须于程序中编写这个循环(Loop)。
打印文件中指定的字段数据并加以计算
awk 处理数据时,它会自动从数据文件中一次读取一行记录,并将该数据切分成一个个的字段;程序中可使用$1,$2,…直接取得各个字段的内容。这个特色让使用者轻易地使用awk 编写reformatter 来改变数据格式。
例子:以文件emp.dat 为例,计算每人应发工资并打印报表。
分析:awk 会自行一次读入一行数据,所以程序中仅需告诉awk 如何处理所读入的数据行。执行如下命令:
$ awk ‘{ print $2,$3 * $4 }’ emp.dat
执行结果时,屏幕出现 :
chenying 21000
linxiyu 23650
…………….
linux/UNIX命令行上,执行awk 的语法为:$awk ’awk程序’ 欲处理的资料文件文件名;本例中程序部分是{print $2, $3 * $4}。 把程序置于命令行时,程序之前后须以’ 括住。emp.dat 为指定给该程序处理的数据文件文件名。本程序中使用:Pattern { Actions } 语法,但是Pattern 部分被省略,表无任何限制条件,所以awk读入每笔数据行后都将无条件执行这个Actions。 print为awk所提供的输出指令,会将数据输出到标准输出stdout(屏幕)。
print 的参数间彼此以”,” (逗号) 隔开,打印出数据时彼此间会以空白隔开。
如果将上述的程序部分储存于文件pay1.awk 中,执行命令时再指定awk 程序文件的文件名。 这是执行awk 的另一种方式,适用于程序较大的情况, 其语法如下:
$ awk -f awk程序文件名 数据文件文件名
$ awk -f pay1.awk emp.dat
awk 中也提供与 C 语言中类似用法的printf()函数,使用该函数可进一步控制数据的输出格式。编辑另一个awk程序如下,并取名为pay2.awk
{ printf(“%10s Work hours: %3d Pay: %5d/n”, $2,$3, $3* $4) }
执行下列命令
$awk -f pay2.awk emp.dat
执行结果屏幕出现:
chenying Workhours: 100 and pay: 21000
linxiyu Workhours: 110 and pay: 23650
degnming Workhours: 130 and pay: 27170
liuchao Workhours: 125 and pay: 27500
hejing Workhours: 95 and pay: 19950
相关文章推荐
- Kubernetes的service mesh——第二部分:以DaemonSet方式运行linkerd
- Kubernetes的service mesh – 第二部分:以DaemonSet方式运行linkerd
- 微信支付-扫码支付方式在ThinkPHP商城中的使用(第二部分)
- (译)如何优化cocos2d程序的内存使用和程序大小:第二部分(完)
- 第二部分 Linux Shell高级编程技巧——第三章 运行级别脚本介绍
- 使用命令行方式运行 JMeter 脚本
- (译)碰撞检测和收集物品:如何使用cocos2d制作基于tiled地图的游戏:第二部分
- Java虚拟机运行时查看内存使用方式的三中方法
- 读取配置文件[方式二]之使用Awk实现
- 使用反射在NET中实现动态工厂(第二部分)
- 如何使用Cocos2d-x 3.0制作基于tilemap的游戏:第二部分
- 如何使用cocos2dx 制作一个多向滚屏坦克类射击游戏-第二部分
- 通过 Axis2 开发 Web 服务,第 1 部分: 通过 Axis2 运行时部署和使用简单 Web 服务
- 使用Eclipse创建Maven WEB项目以及运行项目的几种方式
- (译)如何使用cocos2d开发一个简单的iphone游戏:旋转炮塔。(第二部分)
- Jakarta Struts编程:使用Tiles,第二部分
- (译)如何优化cocos2d程序的内存使用和程序大小:第二部分(完)
- 使用Box2d和cocos2d-x从头开始制作一个弹弓类游戏系列教材的第二部分
- 掌握Ajax 第二部分 使用 JavaScript 和 Ajax 发出异步请求
- 使用命令行方式运行 JMeter 脚本