匹配行包含用love开头的词
\>
词结尾定位
/love\>/
匹配行包含love结尾的词
\(..\)
标志与以后用的字符相匹配
/(love\)able\ler/
Able可达9个标志,模式最左边用第一个标志开始。
例如,模式love保存作标志l,以后引用作\l;在这个例子中,搜索模式包括后面跟lover的lovable
x\{m\}
x\{m,\}
x\{m,n\}
字符x重复m次
至少m次
m到n次
O\{5,10\}
如果行包含5—10个连续的o则匹配
表(2.1)
3.举例
查找文件中的含有love的词:
%vipicnic
Ihadalovelytimeonourlittlepicnic.Loverswereallaroundus,ohlove
:
/love/
4.组合正则表达式元字符
文件内容:
(数字是行号,竖线标明行的左右边界,不属于文件内容。
这个文件我写在shell/exam/exam_2.9中)
1|ChristianScottliveshereandwillputonaChristmasparty.|
2|Therearearound30to35peopleinvited.|
3|Theyare:
|
4|Tom|
5|Dan|
6|RhondaSavage|
7|NickyandKimerly.|
8|Steve,Suzanne,GingerandLarry.|
组合举例:
/^[A-Z]..$/
搜索行以A至Z的一个字母开头,然后跟两个任意字母,然后跟一个换行符的行。
将找到第5行。
/^[A-Z][a-z]*3[0-5]/
搜索以一个大写字母开头,后跟0个或多个小写字母,再跟数字3,再跟0—5之间的一个数字。
*[A-Z][a-z][a-z]$/
搜索以0个或多个空格开头,跟一个大写字母,两个小写字母和一个换车符。
将找到第4行的TOM(整行匹配)和第5行。
注意,*前面有一个空格。
/^[A-Za-z]*[^,][A-Za-z]*$/
将查找以0个或多个大写或小写字母开头,不跟逗号,然后跟0个或多个大写或小写字母,然后跟一个换车符。
将找到第5行。
书中解释有误。
5.更多的正则表达式元字符
这里讨论的元字符不一定可以移植到所有的正则表达式中,但一般可以用在vi、sed和grep中。
%vitextfile
-----------------------------------------------------------------------
Pattywonfourthplaceinthe50yarddashsquareandfair.
Occurenceslikethisarerare.
Haha,whatyouwantisjustfourth.
~
~
:
/\/
将查找词fourth
第3章grep家族
1.grep的含义是“全局搜索正则表达式(RE)并打印该行”
2.grep支持的正则表达式
与在文件中搜索基本一样。
可以参考表2.1。
3.grep的选项
选项
功能
-b
在各行之前放置它发现的块号。
有时在根据上下文定位磁盘字块时有用
-c
显示匹配行数而不是内容
-h
不显示文件名
-I
在座比较时忽略字母大小写
-n
文件中每行之前给出它的相关行号
-s
无声操作。
即除了错误消息外不做任何显示。
用于检查退出状态
-v
把搜索翻转为只显示不匹配的行
-w
把表达式当作一个次来搜索,相当于用\<和\>括起来
表3.1
4.grep命令的退出状态
如果grep操作成功,则状态是0,如果模式没找到,状态是1,如果文件没
找到,状态是2。
如果操作被取消,则状态是130。
查看状态的方法:
在csh
中用echo$status。
在sh和ksh中用echo$?
。
例如
$echo$?
0
5.带正则表达式的grep举例:
用于这些例子的文件叫datafile,位于chap03目录。
内容如下:
northwestNWCharlesMain3.0.98334
westernWESharonGray5.3.97523
southwestSWLewisDalsass2.7.8218
southernSOSuanChin5.1.95415
southeastSEPatriciaHemenway4.0.7417
easternEATBSavage4.4.84520
northeastNEAMMainJr.5.1.94313
northNOMargotWeber4.5.8959
centralCTAnnStephens5.7.94513
1)grepNWdatafile
解释:
打印datafile中包含NW的行
2)grepNWd*
解释:
打印所有以d开头的文件中含有NW的文件。
3)grep'^n'datafile
解释:
打印文件datafile中所有以字母n开头的行
4)grepTBSavagedatafile
解释:
在Savage和datafile文件中查找有TB的行
5)grep'TBSavage'datafile
解释:
在datafile文件中查找含有TBSavage的行并打印。
这个例子在书中有误。
6)grep'^[we]'datafile
打印datafile中以w或者e开头的行
7)grep'ss*'datafile
northwestNWCharlesMain3.0.98334
southwestSWLewisDalsass2.7.8218
解释:
打印所有包含一个s并跟0个或者多个s,然后跟一个空格的行
6.用管道的grep
grep可以从管道得到输入。
%ls–l
drwxr-xr-x6oracledba5124月321:
49chap10
drwxr-xr-x2oracledba5124月1022:
23exam
-rwxr--r--1oracledba18424月321:
51readme.txt
-rwxr--r--1oracledba18014月321:
51unix_readme.txt
%ls–l|grep'^d'
drwxr-xr-x6oracledba5124月321:
49chap10
drwxr-xr-x2oracledba5124月1022:
23exam
%ls-l|grep'^[^d]'
-rwxr--r--1oracledba18424月321:
51readme.txt
-rwxr--r--1oracledba18014月321:
51unix_readme.txt
7.带选项的grep举例:
grep–c‘west’datafile
3
解释计算datafile中含有west的总数。
8.egrep(扩展的grep)
egrep可以使用额外的正则表达式,如下表。
元字符
功能
例子
解释
+
匹配一个或多个前驱字符
'[a-z]+ove'
匹配一个或多个小写字母,后跟ove
?
匹配0个或者1个前驱字符
'lo?
ve'
将找到love或love
a|b
匹配a或者b
'love|hate'
与love或hate匹配
()
组字符
'lov(ely|able)
与lovely或lovable匹配
表3.2
9.egrep举例:
egrep'2\.?
[0-9]'datafile
解释:
打印所有这样的行:
它包含一个2,后跟0个或者一个句号,然后跟一个数字。
10.fgrep
fgrep把所有的元字符都当作字符本身,只代表自己。
11.UNIX工具试验参考答案(内容参考datebook)
●打印包含San的行
grep'San'datebook
●打印所有以J开头的人名所在的行
grep'^J'datebook
●打印以700结尾的行
grep'700$'datebook
●打印所有不包含834的行
grep-v'834'datebook
●打印出生在12月(December)的行
grep'/12'datebook
●打印工资是6位数的行,并给出行号
grep-n'[0-9]\{6,\}$'datebook
第4章流编辑器(sed)
1.sed命令简介
sed是流线型、非交互式编辑器。
它允许你执行与vi和ex编辑器里一样的编辑任务。
Sed程序不是与编辑器交互式工作的,而是让你在命令行里敲入编辑的命令,给文件命名,然后在屏幕上查看命令输出结果。
2.sed如何工作
sed编辑器按一次处理一行的方式来处理文件,并把输出送到屏幕上。
3.sed可以用寻址的方式来决定想要编辑哪一行。
4.sed命令和选项
命令
功能
a\
在当前行上添加一个文本行或者多个文本行
c\
用新闻本改变(取代)当前行里的文本
d
删除行
i\
在当前行之前插入文本
h
把模式空间内容复制到一个固定缓存
H
把模式空间内容添加到一个固定缓存
g
得到固定缓存里所有的禀复制到模式缓存,重写其内容
G
得到固定缓存的内容并复制到模式缓存,添加到里面
I
列出不打印的字符
p
打印行
n
读下一输入行,并开始用下一个命令处理换行符,而不是用第一个命令
q
结束或退出sed
r
从一个文件读如行
!
把命令应用到除了选出的行以外的其他所有行
s
把一个字串替换成另一个
替换标志
g
在一行上进行全局替换
p
打印行
w
把行写到一个文件中
x
用模式空间的内容交换固定缓存的内容
y
把一个字符转换成另一个(不能和整则表达式元字符一起使用)
5.sed元字符
基本上,grep和vi使用的元字符都可以用在sed中。
具体可参照第二章。
下表列出了一些特别的sed元字符:
元字符
功能
例子
解释
&
保存搜索串以便可以记在替换串里
s/love/**&**/
&号代表搜索串。
串love将被星号包围的自身所替代;即love变成**love**
6.sed的实例(使用datafile)
1>打印:
p命令
sed'/north/p'datafile
默认输出所有行,找到north的行重复打印
sed–n'/north/p'datafile
禁止默认输出,只打印找到north的行
2>删除:
d命令
sed'3d'datafile
删除第三行,其余行输出到屏幕
sed'3,$d'datafile
从第3行到最后一行都删除,将剩余部分输出到屏幕
sed'/north/d'datafile
将含有north的行删除,其余输出到屏幕
3>替换:
s命令
sed's/west/north/g'datafile
解释:
找到datafile中的所有west并替换成north,将替换后的内容输出到屏幕。
sed's/[0-9][0-9]$/&.5/'datafile
解释:
在替代串里的&字符代表在搜索串中真正找到的。
每个以两个数字结尾的行都被它自己取代,且要在后面加上.5
sed-n's/Hemenway/Jones/gp'datafile
解释:
所有的Hemenway所在的位置都用Jones来取代,而且只有改变的行被打印。
-n与p命令选项相结合来禁止默认输出。
g代表全局替换
sed-n's/\(Mar\)got/\1ianne/p'datafile
解释:
模式Mar被封装在括弧里且在一个专用寄存器里存为标记1。
在替换串里它将被引用做\1。
然后用Marianne替代Margot。
sed's#3#88#g'datafile
s命令后面的字符是搜索串和替换串之间的分界符。
默认的分界符是一个正斜杠,但也可以改变(只有使用s命令时)。
无论s命令后面跟什么字符,它都是新的串分界符。
当搜索包含一个正斜杠的模式,如路径或生日时,这种技巧可能有用
4>被选中的行的范围:
逗号
sed-n'/west/,/east/p'datafile
打印在west和east之间的模式范围内所有行。
如果west出现在east之后,则打印从west到下一个east或者到文件末尾的行,无论哪种情况先出现都可以。
sed'/west/,/east/s/$/**VACA**/'datafile
解释:
对于在模式west到east范围内的行,行末尾将用**VACA**来取代。
5>多次编辑-e选项
sed-e'1,3d'-e's/Hemenway/Jones/'datafile
-e选项允许多次编辑。
不同的编辑顺序可能导致不同的结果。
例如,如果两个命令都执行了替换,第一次替换可能影响第二次替换。
6>从文件中读取:
r命令
sed'/Suan/rnewfile'datafile
解释:
r命令从newfile中读取内容,将内容输出到Suan的后面。
如果datafile中Suan出现的次数不只一次,则分别放到Suan的后面。
7>写入文件:
w命令
sed-n'/north/wnewfile'datafile
解释:
w命令把指定的行写入到一个文件。
本例中所有的包含north的行写入到newfile中。
等同于sed-n'/north/p'datafile>newfile
8>添加:
a命令
$sed'/north/a\
>---->THENORTHSALESDISTRICTHASMOVED<-----'datafile
northwestNWCharlesMain3.0.98334
---->THENORTHSALESDISTRICTHASMOVED<-----
westernWESharonGray5.3.97523
southwestSWLewisDalsass2.7.8218
southernSOSuanChin5.1.95415
southeastSEPatriciaHemenway4.0.7417
easternEATBSavage4.4.84520
northeastNEAMMainJr.5.1.94313
---->THENORTHSALESDISTRICTHASMOVED<-----
northNOMargotWeber4.5.8959
---->THENORTHSALESDISTRICTHASMOVED<-----
centralCTAnnStephens5.7.94513
解释:
红颜色的内容是要输入的内容。
a\命令后面跟要添加的内容。
奇怪的是a\后面必须另起一行,在输入要添加的内容,否则会提示命令错乱,真是搞不懂。
9>插入:
i命令
$sed'/north/i\
>---->THENORTHSALESDISTRICTHASMOVED<-----'datafile
---->THENORTHSALESDISTRICTHASMOVED<-----
northwestNWCharlesMain3.0.98334
westernWESharonGray5.3.97523
southwestSWLewisDalsass2.7.8218
southernSOSuanChin5.1.95415
southeastSEPatriciaHemenway4.0.7417
easternEATBSavage4.4.84520
---->THENORTHSALESDISTRICTHASMOVED<-----
northeastNEAMMainJr.5.1.94313
---->THENORTHSALESDISTRICTHASMOVED<-----
northNOMargotWeber4.5.8959
centralCTAnnStephens5.7.94513
解释:
在符合模式的行前面插入内容。
其余和a\命令相同。
10>下一个:
n命令
$sed'/eastern/{n;s/AM/Archie/;}'datafile
northwestNWCharlesMain3.0.98334
westernWESharonGray5.3.97523
southwestSWLewisDalsass2.7.8218
southernSOSuanChin5.1.95415
southeastSEPatriciaHemenway4.0.7417
easternEATBSavage4.4.84520
northeastNEArchieMainJr.5.1.94313
……
解释:
如果在某一行里模式eastern被匹配,n命令使sed区的下一行,用该行带换模式空间,用Archie替换AM,打印并继续。
11>变换:
y命令
sed'1,3y/abcdefghijklmnopqrst/ABCDEFGHIJKLMNOPQRST/'datafile
解释:
将对应字母进行转换。
12>退出:
q命令
sed'5q'datafile
解释:
在打印了5行之后,用q命令退出sed程序。
13>保存和取得:
h和G命令
$sed-e'/southeast/h'-e'$G'datafile
northwestNWCharlesMain3.0.98334
westernWESharonGray5.3.97523
southwestSWLewisDalsass2.7.8218
southernSOSuanChin5.1.95415
southeastSEPatriciaHemenway4.0.7417
easternEATBSavage4.4.84520
northeastNEAMMainJr.5.1.94313
northNOMargotWeber4.5.8959
centralCTAnnStephens5.7.94513
southeastSEPatriciaHemenway4.0.7417
解释:
当sed处理文件时,每行都存在模式空间(patternspace)的临时缓存中。
除非行被禁止打印或删除,否则行将在处理完后被打印到屏幕,然后请模式空间并把下一输入行保存在那里等待处理。
在这个例子中,在找到模式之后,把它放在模式空间里,而且h命令复制它并把它存到另一个叫做保存缓存(holdingbuffer)中。
第二个sed指令里,当读入最后一行($)时,G命令告诉sed从包存缓存中取得该行并放回模式空间缓存,添加到当前存在那里的行中。
本例子就是最后一行。
$sed-e'/WE/{h;d;}'-e'/CT/G'datafile
northwestNWCharlesMain3.0.98334
southwestSWLewisDalsass2.7.8218
so