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应用自如了