sed结构分析

sed/awk教程众多,大多是实例教材,以举例为主;或者是语法教材,以语法讲解为主。

学习了sed,又学习awk,结果学着学着,很容易迷糊,语法容易混淆。

本文主要讲解sed的结构,使大家学习完以后对sed有一个整体性的把握。

至于什么叫做结构,看完应该可以明白。

本人sed/awk所学有限,错误之处请大家不吝指出。

1: sed 语法

sed -e 'pattern + action' textfile

意思:对于一个文本文件textfile,用pattern去匹配,找到匹配的字符串,copy到pattern space中,然后对pattern space中的文本执行action。

执行完action以后,接着从textfile的当前行的下一行开始,继续使用pattern去匹配,继续copy到pattern space中,继续执行action,直到结束。

解释点1:由于匹配的字符串是拷贝到pattern space中,action是对pattern space中的字符串操作,所以不会影响到原文本文件。

详细过程:

**sed执行过程:

  a. 如果已到达文件尾,goto e;否则,用pattern去匹配,找到匹配的字符串,copy到pattern space中,然后对pattern space中的文本执行action。

  b. 执行命令序列,命令只对模式空间有效;

  c. 当前行号加1

  d. goto a;

  e. 退出

2:pattern -- 行(基本单位)与字符串匹配(基本动作)的组合

sed称为“行编辑器”,每当sed看见一个文本,在它心中,这个文本就是用换行符隔开的一行一行一直到无穷行。

在sed眼中,文本的基本单位只有一种,那就是行。这些行分别编号为1,2,3,4,5,6,... $。

行只有一个动作,那就是这个行匹配某字符串序列或者不匹配某字符串序列。

组合起来,于是有以下几种pattern。

a. A行做某事                                            sed -e '3d' textfile

b. A行到B行做某事                                       sed -e '3, 5d' textfile

c. 匹配某字符串序列的某行                               sed -e '/www/d' textfile

d. 匹配字符串“你好”到“此致敬礼”一段文本的许多行         sed -e '/你好/,/此致敬礼/p' textfile

e. 匹配从A行开始,到“此致敬礼”一段文本                  sed -e '3,/此致敬礼/p' textfile

f. 匹配从“你好”开头,到B行结束的一段文本                sed -e '/你好/, 10p' textfile

3: action

常用action,相关的文档许多,诸位可以从网上查找。

需要说明的是

a. hold space和pattern space。

把匹配的字符串拷贝到了pattern space中,接着可以对pattern space执行动作。

如果我们在处理这个pattern space中的内容以前,必须先处理一些其它事情,也就是操作对象有两个或者两个以上,那么一个buffer显然是不够的。

所以引入了hold space。

b. s/regexp/replacement/ 可以看作是 /regexp/s/regexp/replacement/

好了,剩下的是把sed所有action学习明白,你就能够对sed应用自如了。

awk结构分析

1: awk 语法

gawk 'pattern  { action }' textfile

咋一看,和sed语法 sed 'pattern action' textfile类似。

这正是sed/awk容易混淆的原因之一,sed/awk语法基本类似,细微的差别就是awk的action,需要用大括号括起来。

awk的执行流程也是,输入文本,匹配pattern,执行action,接着匹配pattern,接着执行action。注意:awk没有模式空间一说。

它的action也和sed完全不一样。

2:pattern

在awk眼中,一个文本过来,被它看成了一个表格。

详细的说,一个文本过来,awk不管三七二十一先用RS字符串把它切成一行一行的,然后对每一行用FS切成一个一个的表项。

所以,awk里面文本有两个基本单位,一个是行,一个是表项。(回忆一下,sed文本只有一个基本单位,行)。

awk里面对每行编号为,1,2,3,4,5,... NR

对每行里面每个表项的编号是 $1 $2 $3 ... $NF,对整行特殊编号为$0

a. 由于NR NF 为数字,并且$n也可以为数字,那么可以进行数字比较,找出需要的pattern。

    比如,第三项的值为日期号,判断日期大于20 可以写做 $3 > 20

    数字比较有如下6种方法

    < <=

    > >=

    == !=

b. 由于$n也可以是字符串,那么也可以采取字符串匹配的方法构造pattern

    比如,含有字符串“www”的行 模式可以写做 $0 ~ /www/

    比如,第五项不包含字符串“com”,模式可以写做 $5 !~ /com/

c. 模式可以为模式范围

    A pattern range is two patterns separated by a comma.

    The action is performed for each input line between the occurrence of the first and second pattern.

    /regular expression 1/, /regular expression 2/   { print $0 }

d. 模式组合

    Patterns can be combined to provide more powerful and complex matching.

    The following symbols are used to combine patterns.

            ||              logical or, either pattern can match

            &&              logical and, both patterns must match

            !               logical not, patterns not matching

3: action

action就是对选定对象进行操作。

主要的动作有如下三类。

动作一:print 和 printf, printf基本上和c语言类似。

动作二:内置函数。最常用的一个是gsub/sub

加上C语言的for, while, do-while, if-else流程控制,

再加上awk特色的变量,数组定义和使用,构成了awk的action。

4: BEGIN/END

BEGIN{} 开始之前设置一些FS,RS等等动作。

END{} 结束的时候执行一些action。

awk大体结构就是这样,然后对awk数组需要特别理解,了解awk内置函数的用法,反复练习,应该可以对awk应用自如了

 posted on 2011-04-22 10:21  chingliuyu  阅读(223)  评论(0编辑  收藏  举报