awk详细教程:第二部分
2.3 表达式和运算符
awk 允许使用正则表达式,根据正则表达式是否匹配当前行来选择执行独立代码块。以下示例脚本只输出bill中包含字符序列8613902700003的那些行:
- awk '/8613902700003/ { print }' bill
当然,可以使用更复杂的正则表达式:
- /[0-9]*/ { print }
下面列出正则表达式元字符:
字符 |
描述 |
. |
可代替除一行之外的任何单个字符 |
* |
可代替零个或多个在它前面出现的字符 |
[chars] |
可代替chars中的任何一个字符,chars是一串字符序列。你可以用-符号来定义一个字符范围。如果^是chars中的第一个字符,那么将匹配没有在chars中指定的字符 |
^ |
匹配一行的开头 |
$ |
匹配一行的结尾 |
\ |
把\后面的字符照常输出,通常用来转义(不使用特殊含义)一个元字符 |
除了使用正则表达式来选择行,我们也可以使用布尔表达式来选择行。使用方法是将布尔表达式放在代码块之前,仅当对前面的布尔表达式求值为真时,awk才执行代码块。以下示例脚本将输出bill中第四个字段等于8613902700003的所有行中的第三、四字段。如果当前行的第四个字段不等于8613902700003,awk将继续处理文件而不对当前行执行print语句:
- $4 == "8613902700003" { print "OrgAddr: "$3, "\tDestAddr: "$4 }
注意,代码块前的布尔表达式必须与代码块在同一行上。
awk 提供了完整的比较运算符集合,包括"=="、"<"、">"、"<="、">="和"!="。另外,awk还提供了"~"和"!~" 运算符,它们分别表示“匹配”和“不匹配”。它们的用法是在运算符左边指定变量,在右边指定正则表达式。例如:
- $4 ~ /8613902700003/ { print "OrgAddr: "$3, "\tDestAddr: "$4 }
awk还允许使用布尔运算符"||"(逻辑或)和"&&"(逻辑与),以便创建更复杂的布尔表达式:
- ( $3 == "8613902700001" ) && ( $4 == "8613902700003" ) { print }
awk的另一个优点是它有完整的数学运算符集合。除了标准的加、减、乘、除,awk还允许使用指数运算符"^"、模运算符"%"和其它许多从C语言中借入的易于使用的赋值操作符。
这些运算符包括前后加减(i++、--j)、加/减/乘/除赋值运算符(a+=3、b*=2、c/=2.2、d-=6.2)。不仅如此,还有易于使用的模/指数赋值运算符(a^=2、b%=4)。
2.4 字符串化变量
awk变量“字符串化”是指所有awk变量在内部都是按字符串形式存储的。而且只要变量包含有效数字字符串,就可以对它执行数学操作,awk会自动处理字符串到数字的转换步骤。请看以下这个示例:
- BEGIN { x="0" }
- /^$/ { x=x+1 }
- END { print "I found " x " blank lines. :)" }
这个例子的功能是计算文件中空白行的数量,^$表示空行。如果做一个小实验,就可以发现如果某个特定变量不包含有效数字,awk在对数学表达式求值时会将该变量当作数字0处理。
3 第二部分:提高
3.1 处理多行
在这一节里,顺带着讲一下三个特别的变量:
Awk特殊变量 |
描述 |
RS |
表示记录分隔符 |
OFS |
表示输出字段分隔符,在两个单独的字段间插入定义的字符串 |
ORS |
表示输出记录分隔符,在两个单独的记录间插入定义的字符串 |
第一部分我们讨论的都是一个记录占用一行的情况,如果要分析占据多行的记录,除了依靠FS,还需要设置RS(记录分隔符变量)。RS变量告诉awk当前记录什么时候结束,新记录什么时候开始。
为了便于讨论,我们依然首先在当前目录下生成一个通讯录文件address,其内容如下:
zhangsan 13712345678 zhs@hotmail.com lisi |
要处理这个文件,可以将每三行看作是一个独立的记录,一个记录包含三个字段。如下脚本将原记录由三行转换成一行输出:
- BEGIN {
- FS="\n"
- RS=""
- }
- {
- print $1 ", " $2 ", " $3
- }
此代码将产生以下输出:
zhangsan, 13712345678, zhs@hotmail.com lisi, 13012345678, ls@21cn.com |
在上面例子中,为了在三个字段之间插入一个逗号和空格,使用了", "。这个方法虽然有用,但比较难看。其实我们还有更好的方法,那就是设置变量OFS(输出字段分隔符)。OFS缺省情况下被设置成" "(单个空格)。使用如下脚本可以达到上面例子同样的效果:
- BEGIN {
- FS="\n"
- RS=""
- OFS=", "
- }
- {
- print $1, $2, $3
- }
awk还有一个特殊变量ORS(输出记录分隔符)。ORS缺省情况下被设置成"\n",如果我们将其设为"\n\n",就可以使输出记录的间隔翻倍。例子就不举了,大家可以自己试试。个空格分隔记录(而不换行),将ORS设置成" "。
需要注意的是,使用上面的方法,最多只能处理一个记录占用三行的文本,象下面一个记录占据四行的通讯录,就处理不了了(大家可以试试看):
wangwu 13512345678 ww@163.com wuhan, hubei |
要处理这种情况,代码最好考虑每个记录的字段数量,并依次打印每个记录。以下就是修正的代码:
- BEGIN {
- FS="\n"
- RS=""
- ORS=""
- }
- {
- x=1
- while ( x<NF ) {
- print $x "\t"
- x++
- }
- print $NF "\n"
- }
程序输出如下:
wangwu 13512345678 ww@163.com wuhan, hubei |
转载于:https://blog.51cto.com/bubble/1179115
awk详细教程:第二部分相关推荐
- Python实现飞机大战-第二部分(附源码、素材、超详细教程)
飞机大战第二部分 1.前言 2.飞机射击 2.1.添加子弹的相关设置 2.2.创建文件bullet.py 2.3.修改game_functions.py 2.4.修改mian.py 2.5.射击效果 ...
- Linux编写makefile详细教程
Linux下编写 makefile 详细教程 近期在学习Linux下的C编程,买了一本叫<Linux环境下的C编程指南>读到makefile就越看越迷糊,可能是我的理解能不行. 于是goo ...
- linux完美卸载编译的php,互联网常识:Linux(Ubuntu)安装和完美卸载PHP7详细教程
跟大家讲解下有关Linux(Ubuntu)安装和完美卸载PHP7详细教程,相信小伙伴们对这个话题应该也很关注吧,现在就为小伙伴们说说Linux(Ubuntu)安装和完美卸载PHP7详细教程,小编也收集 ...
- 如何用fiddler抓取HTTPS的详细教程(附fiddler安装教学)
对于想抓取HTTPS的测试初学者来说,常用的工具就是fiddler,可是在初学时,大家对于fiddler如何抓取HTTPS真是伤了脑筋,可能你一步步按着网上的帖子成功了,那当然是极好的,有可能没有成功 ...
- clion配置_Ubuntu16.04系统下用CLion编译器调试ROS代码详细教程
本教程主要实践如何创建一个ROS工作空间和功能包实现基于ROS的信息发送和接收,同时用CLion如何去调试这个ROS工程.ROS允许多个工作空间并存,每个工作空间中创建需要的功能包,功能包创建于工作空 ...
- [java手把手教程][第二季]java后端博客系统文章系统——No10
项目github地址:github.com/pc859107393- 实时项目同步的地址是国内的码云:git.oschina.net/859107393/m- 我的简书首页是:www.jianshu. ...
- spring入门详细教程(五)
前言 本篇紧接着spring入门详细教程(三),建议阅读本篇前,先阅读第一篇,第二篇以及第三篇.链接如下: Spring入门详细教程(一) https://www.cnblogs.com/jichi/ ...
- Spring入门详细教程(四)
前言 本篇紧接着spring入门详细教程(三),建议阅读本篇前,先阅读第一篇,第二篇以及第三篇.链接如下: Spring入门详细教程(一) https://www.cnblogs.com/jichi/ ...
- Spring入门详细教程(三)
前言 本篇紧接着spring入门详细教程(二),建议阅读本篇前,先阅读第一篇和第二篇.链接如下: Spring入门详细教程(一) https://www.cnblogs.com/jichi/p/101 ...
最新文章
- Git忽略文件方法【转】
- 简单的shell脚本实例
- 主流深度学习框架对比(TensorFlow、Keras、MXNet、PyTorch)
- redis事务的简单介绍
- win10c语言安装未响应,重新安装win10以后,系统总会死机,不响应任何操作,严重影响正常使用。...
- 大数据学习笔记41:Hive - 用户自定义函数
- 连接远程Windows主机中的虚拟机
- 苹果大幅削减iPad产量 将芯片等部件调配给iPhone 13
- 进入前端行业之前我们需要了解什么,明白这些就可以
- php四则运算出题器_PHP实现的简单四则运算计算器功能示例
- python编程语言继承_Python 面向对象编程——继承和多态
- 查看显卡信号_既然大家说装了win10,就不用鲁大师监测显卡温度,为什么呢
- 设计模式之—工厂方法模式
- “中华优秀科普图书榜”
- 好用的小巧的免费功能强大的电脑截图软件Snipaste下载安装
- XZ压缩最新压缩率之王
- Android——RecyclerView——Recycler类全部源码翻译及注释
- [QDialog]qt虚拟键盘的实现以及qdateedit实现打开虚拟键盘
- Android布局原理与优化
- 微信小程序点击--实现带字母索引的城市列表