免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
1234下一页
最近访问板块 发新帖
查看: 19022 | 回复: 33
打印 上一主题 下一主题

【原创】sed与awk学习笔记 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-03-10 22:21 |只看该作者 |倒序浏览
版权声明:
本文遵循“署名-非商业性使用-相同方式共享 2.5 中国大陆”协议
您可以自由复制、发行、展览、表演、放映、广播或通过信息网络传播本作品
您可以根据本作品演义自己的作品
您必须按照作者或者许可人指定的方式对作品进行署名。
您不得将本作品用于商业目的。
如果您改变、转换本作品或者以本作品为基础进行创作,您只能采用与本协议相同的许
可协议发布基于本作品的演绎作品。
对任何再使用或者发行,您都必须向他人清楚地展示本作品使用的许可协议条款。
如果得到著作权人的许可,您可以不受任何这些条件的限制。


整理这么一份笔记是因为所看到的大多书籍与文档太晦涩,让人读着很累,更容易走神。
我很喜欢鸟哥的风格,更平易近人一些,所以这篇文档也尽力写的更通俗。
39页的word文档,不是很多,但的确是自己写过的最多的一次,错误之处在所难免,欢迎交流探讨~!


SED与AWK学习笔记

张逸群 jeantoe@gmail.com

Blog www.zhangyiqun.cn

前言
开卷有益。
在it领域有很多学习的途径,个人认为最好的学习教材是原版图书,但由于语言上的问题,大多数人只能望书兴叹。这39页的文档是根据我自学时的实际情况,和大多数的实际需要情况所写。其中示例大部分参考了O'Reilly.SED and AWK 。
每篇文章中所带的小练习或来自工作或来自网络,希望读者能够多加练习,实践才是王道。
文档完成于2009-1-31
基本概念
Sed是一个“非交互式”的面向字符流的编辑器。
这个面向字符流就像是我去餐厅点了一道菜让厨师做,菜都是字符,厨师做好后直接送到我面前。所以我只要下达命令就好。

Sed的优点是可以在一个地方指定所有的编辑指令,然后通过文件传递一次来执行他们。但是它在每次多于一行的处理能力方面有限制。
Awk的典型应用是将数据转换成格式化的报表。增强可读性。因此当数据有某种结构时就能最好的体现awk的好处。Awk的功能是非常强大的,甚至可以说成是程序设计语言。

基本操作
框架:
命令 选项 工作内容 文件名
Sed和awk的输出都不允许送到向程序提供输入的同一个文件,否则会使它变成乱码。如果工作内容中包含shell可执行的字符如“$和*”,那么必须用单引号引起。
Sed和awk都可以用-f来指定工作内容,这通常就是脚本存放的位置。
使用过程中,短的脚本可以在命令行上指定,长的脚本通常放在容易被修改和测试的文件中。

在sed和awk中,每个指令都包含两个部分,模式和语句。模式是由/分隔的正则。语句指定一个或多个将被执行的动作。
Awk不自动输出行,脚本中的指令控制awk最终所做的事情。
Sed的语句由类似于行编辑器中使用的那些编辑命令组成。大部分命令由单个字母组成。
Awk的语句由程序设计语句和函数组成,语句必须用大括号括起。

初识sed
最常见的s 。替换字符串。
$ sed 's/MA/Massachusetts/' list
找出MA并替换成Massachusetts
John Daggett, 341 King Road, Plymouth Massachusetts
Alice Ford, 22 East Broadway, Richmond VA
Orville Thomas, 11345 Oak Bridge Road, Tulsa OK
Terry Kalkas, 402 Lans Road, Beaver Falls PA
Eric Adams, 20 Post Road, Sudbury Massachusetts
Hubert Sims, 328A Brook Road, Roanoke VA
Amy Wilde, 334 Bayshore Pkwy, Mountain View CA
Sal Carpenter, 73 6th Street, Boston Massachusetts
并不是在任何情况下都要将指令用单引号包围起来,但你应该养成这个习惯。
在城市和州之间放置逗号,这时候就需要单引号。
$ sed 's/ MA/, Massachusetts/' list
John Daggett, 341 King Road, Plymouth, Massachusetts
Alice Ford, 22 East Broadway, Richmond VA
Orville Thomas, 11345 Oak Bridge Road, Tulsa OK
Terry Kalkas, 402 Lans Road, Beaver Falls PA
Eric Adams, 20 Post Road, Sudbury, Massachusetts
Hubert Sims, 328A Brook Road, Roanoke VA
Amy Wilde, 334 Bayshore Pkwy, Mountain View CA
Sal Carpenter, 73 6th Street, Boston, Massachusetts
如果不加单引号,那么会得到一个错误提示sed: -e expression #1, char 2: unterminated `s' command
关闭自动输出,只打印被修改行。这里用了参数-n(关闭自动输出)和p(打印被修改行)
$ sed -n -e 's/MA/Massachusetts/p' list
John Daggett, 341 King Road, Plymouth Massachusetts
Eric Adams, 20 Post Road, Sudbury Massachusetts
Sal Carpenter, 73 6th Street, Boston Massachusetts

在命令行上编写多个语句。
使用;分隔
sed 's/ MA/, Massachusetts/; s/ PA/, Pennsylvania/' list
使用-e
sed -e 's/ MA/, Massachusetts/' -e 's/ PA/, Pennsylvania/' list

初识awk
为了能和shell区分开,awk的指令都必须包括单引号,因为$这类符号在shell中是有特殊意义的。虽然awk与sed指令的结构相同,但awk中用语句和函数取代了使用一个或两个字符组成的命令。

Awk将每个输入行识别成一条记录,而将那一行上的每个单词识别成一个字段。

$ awk '{ print $1 }' list
John
Alice
Orville
Terry
Eric
Hubert
Amy
Sal
打印含有MA的行
$ awk '/MA/' list
John Daggett, 341 King Road, Plymouth MA
Eric Adams, 20 Post Road, Sudbury MA
Sal Carpenter, 73 6th Street, Boston MA
打印含有MA的行的第一个字段
$ awk '/MA/ { print $1 }' list
John
Eric
Sal
使用-F指定字段分隔符为逗号。意思是说逗号前的字段是$1或者$其他。这就使得原来可能$1 $2的内容都合并成了$1。
$ awk -F, '{ print $1; print $2; print $3 }' list
John Daggett
341 King Road
Plymouth MA
Alice Ford
22 East Broadway
Richmond VA
Orville Thomas
11345 Oak Bridge Road
Tulsa OK
Terry Kalkas
402 Lans Road
Beaver Falls PA
Eric Adams
20 Post Road
Sudbury MA
Hubert Sims
328A Brook Road
Roanoke VA
Amy Wilde
334 Bayshore Pkwy
Mountain View CA
Sal Carpenter
73 6th Street
Boston MA
新手常见错误
没有用大括号{}。没有用单引号’’。没有用斜杠将正则括起来//。

正则表达式
引语
Grep、sed、awk都使用正则,然而这3个程序并不能完全使用正则表达式语法中的所有元字符。所谓元字符就是指那些在正则表达式中具有特殊意义的专用字符,可以用来规定其前导字符(即位于元字符前面的字符)在目标对象中的出现形式。
注:本篇十分简陋,想深入学习正则可以找一本《精通正则表达式》。

表达式
表达式告诉计算机如何产生结果。但和加减乘除一样,在式子中也存在着优先级的问题。需要注意的一点是正则是区分大小写的。
那么正则是如何工作的呢,请看下图。

[ 本帖最后由 jean2e 于 2009-3-11 18:53 编辑 ]

sed与awk.rar

253.56 KB, 下载次数: 1016

论坛徽章:
0
2 [报告]
发表于 2009-03-10 22:27 |只看该作者

回复 #1 jean2e 的帖子

这么晚还上传,支持一下

论坛徽章:
0
3 [报告]
发表于 2009-03-10 22:30 |只看该作者
写的不错,值得收藏,哈哈ing

论坛徽章:
0
4 [报告]
发表于 2009-03-10 22:45 |只看该作者
谢谢楼上二位的支持
补充说明下:文档中出现的代码我全部练习过多遍,朋友们有不理解的可以和我交流哦~

论坛徽章:
0
5 [报告]
发表于 2009-03-10 22:46 |只看该作者
谢谢!辛苦了

不过,请问为什么要用word文档?我看了一下,只有一张图可能一般的编辑器不能用之外,其它的用一般的编辑器都可完成
我不是有偏见,而是为了看这个,我得用打开一个word(资资啊)

论坛徽章:
0
6 [报告]
发表于 2009-03-10 22:47 |只看该作者
严重支持!

论坛徽章:
0
7 [报告]
发表于 2009-03-10 22:50 |只看该作者

回复 #5 haimming 的帖子

因为方便编辑呀,比如弄个加大号字体什么的。这个文档用google的在线doc看也不错,不用跑word

论坛徽章:
0
8 [报告]
发表于 2009-03-10 22:57 |只看该作者

回复 #7 jean2e 的帖子

google在线doc,没试过,听起来不错,学习了

不过,还是支持纯文本,个人意见,个人喜好吧

论坛徽章:
0
9 [报告]
发表于 2009-03-11 09:29 |只看该作者
不错,浏览了一下。值得新手学习一大把。

论坛徽章:
0
10 [报告]
发表于 2009-03-11 09:35 |只看该作者
谢谢共享,支持一下,正好要找这方面的资料呢!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP