分类: LINUX
2009-12-11 15:30:14
学习方法探讨:
有一个事实必须承认,Unix/Linux自由开源所带来的资源共享好处的同时也带来了重复使用,各自为山,非标准化等不好的东西。这给我们学习Unix/Linux带来了非常大的困难,有时会浪费大量时间在一些无意义的学习和重复技术上。比如:shell下存在大量的命令,各种工具也是多如牛毛,并且命令或者工具之间功能存在重复,另外,这些重复部分的语法切各不相同,比如 grep awk sed 都有正则表达式匹配的功能,但是三者的正则表达式语法又有点不相同。并且,每个工具还分 GNU 版和不是 GNU 版,之间的差别也很大,即使都是 GNU 版,那么版本号的细微差别也会带来很多差别。
我觉得对于GNU/Linux的学习可以采取二八原则的方法,即用20%的时间学习80%的知识,比如说随便一个命令都有一大堆的选项,而在现实80%的应用只会用到20%的选项,另外的80%选项可能永远用不到,所以想快速掌握这个命令,只需要学习这20%常用选项即可。
另外你必须找到一个最快的途径能获取你不知道的剩余的80%。对于sed/awk/正则表达式的学习则更是这样,如果要全面的学习这些内容,你至少需要看《sed & awk》,
《Mastering.Regular.Expressions.3rd.Edition.Aug.2006.chm》书籍,这每一本都四五百页,为了学习这两个工具,你估计都得花几个礼拜的时间,但可能你就是在一两个地方用到一下。算一下性价比确实不高。所以为了节省时间,学习快速参考手册或者别人写
的总结则是一个很好的学习途径。
一、sed总体认识:
1)sed一个非交互式的可进行批处理文本流编辑器。
2)处理方式:逐行从参数中指定的输入文件读入一行到模式空间--临时行缓冲区,然后进行模式匹配,如果匹配成功则依次执行后面的命令。同时将结果发送到标准输出或者重定向的文件中去。
3)sed书写格式:
sed [-n][-e] ‘[address[,address]][!]command [arguments]’ inputfiles
sed [-n] -f scriptfile file(s) #此种情况用的非常少,所以不考虑这种情况。
说明:
*第二中方式用的极少,暂时不考虑此种情况。
*address我们也叫定位文本的方式,一般包括两种:行号和正则表达式,我们一般把他们同意叫成正则表达式。
*address可以有两个,它们之间用“,”分开,表示从address1到address2之间的所有行。
*a, i, r, q, and =.命令前面只能有一个address。
*address后面的"!"表示和address定位到的行相反的所有行。
二、sed常用方法:
sed 选项 ‘正则表达式 命令’ 输入文件
选项:
-n 不打印; sed不写编辑行到标准输出,缺省为打印所有行(编辑和未编辑),p命令可以用来打印编辑行
-e 下一命令是编辑命令,使用多项编辑时加入此选项
-i 编辑原文件(此选项慎用,如果使用则原文件就会被修改,无法恢复)。
-f 后面指定的脚本文件中所有命令相当于一个命令一样地被执行
正则表达式:
x #x为一行号,比如1
x,y #表示行号范围从x到y,如2,5表示从第2行到第5行
/pattern/ #查询包含模式的行,如/disk/或/[a-z]/
/pattern/pattern/ #查询包含两个模式的行,如/disk/disks/
/pattern/,x #在给定行号上查询包含模式的行,如/disk/,3
x,/pattern/ #通过行号和模式查询匹配行,如 3,/disk/
x,y! #查询不包含指定行号x和y的行
常见的几个命令:
s #使用pattern2替换pattern1,有点特别是"s"写在前面sed 's/pattern1/pattern2/g' testfile
p #打印匹配行 sed -n '/pattern/p' testfile
d #删除匹配行 sed '/pattern/d' testfile
i #在匹配行前插入指定文本 sed '/pattern/i\--toinsert--' testfile
a #在匹配行后附加指定文本信息 sed '/^pattern/a\--toappend--' testfile
其他命令
g #在行内进行全局替换,常和s配合使用 sed 's/pattern1/pattern2/g' testfile
c #将当前匹配行修改成指定文本行 sed '/ming/c\-student-' datafile
r #将一个文件的内容追家到匹配行的后面 sed '/pattern/r file' datafile
w #将当前匹配的行写入到一个新文件中sed -n ‘/pattern/w newfile’ datafile
q #处理完前面的模式匹配完成后退出 sed ‘5q’ datafile
= #显示文件行号 sed -n '$=' datafile === wc -l
y #按照一对一的方式从左到有进行转换 sed '1,3y/abc/ABC/' datafile
其他参考资料:
GNU sed:
《Quick Reference for sed》