sed与awk学习笔记
1、除特别说明外,本博客内容皆为原创,可以自由转载传播,但请署名及注明出处,不尊重别人劳动成果的不欢迎;
2、本博客内容遵守“署名-非商业性使用-禁止演绎 2.5 中国大陆”协议;
整理这么一份笔记是因为所看到的大多书籍与文档太晦涩,让人读着很累,更容易走神。
我很喜欢鸟哥的风格,更平易近人一些,所以这篇文档也尽力写的更通俗。
39页的word文档,不是很多,但的确是自己写过的最多的一次,错误之处在所难免,欢迎交流探讨~!
下载地址:SED与AWK学习笔记
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个程序并不能完全使用正则表达式语法中的所有元字符。所谓元字符就是指那些在正则表达式中具有特殊意义的专用字符,可以用来规定其前导字符(即位于元字符前面的字符)在目标对象中的出现形式。
注:本篇十分简陋,想深入学习正则可以找一本《精通正则表达式》。
工具
火狐正则表达式测试插件
https://addons.mozilla.org/zh-CN/firefox/addon/2077