linux 正则表达式
标签:
linuxshell正则表达式it |
分类: shell |
热身
正则表达式(regular
例如
下面先举个简单例子来让大家对正则表达式有个直观的感受。ls命令是linux下最常用的命令。ls命令是list的缩写,缺省下ls用来打印出当前目录的清单。
http://www.linuxidc.com/upload/2011_11/111112085691231.gif正则表达式" />
现在,我们只希望列出以d开头的文件或目录,可以用ls
http://www.linuxidc.com/upload/2011_11/111112085691232.gif正则表达式" />
举一反三,列出以che
是不是觉得有些觉得过于简单了啊??!!好吧,打完小怪,现在升下级。
开始……
如何列出当前目录下的所有目录(不包含下面的子目录)?
思考……
又到了使出正则表达式杀手锏的时候了,在这里,我们还是使用ls
http://www.linuxidc.com/upload/2011_11/111112085691233.gif正则表达式" />
这样列出来的内容有些多,没完全截下来所有显示结果,但这并不妨碍本文的讲解。
考虑到普通文件是以-开头,如dataf1.txt文件;目录是以d
http://www.linuxidc.com/upload/2011_11/111112085691234.gif正则表达式" />
所以我们就从d这里作为突破口,这时,你会想到,有多少个“开头”的d就应该有多少个目录,太聪明了,好吧,我们按照你的思路实践下。
现在,问题出来了,怎么统计出来有多少个“开头”的d?你想到了linux中grep命令,还想到了正则表达式,于是grep和正则表达式开始粉墨登场了……
http://www.linuxidc.com/upload/2011_11/111112085691235.gif正则表达式" />
ls
这条简单的命令就轻松解决了我们的问题,。"^d"???你纳闷了,这个小东西配合起来怎么会有那么大的威力呢?这好比玩三国杀时刘备、司马懿、香香之间配合的威力……"^d",就是正则表达式的用法,"^"表示匹配行首,"^d"合起来就表示以d开头的一行,grep
谜底解开。现在你又想到,前面不是说还有一种方法的么,既然如此迫不及待,那就只好顺水推舟了。
第二种方法还是基于ls命令,但是用了-F
http://www.linuxidc.com/upload/2011_11/111112085691236.gif正则表达式" />
仔细观察我们发现,在文件名后面,会多出了一些符号,如目录adv_shell名字后多了条斜扛(/),可执行文件checkhost.sh名字后多了个星号(*)……在此,如果想更多了解这些符号意义,可以查看ls
我们现在把注意力集中到目录adv_shell名字后多了条斜扛(/)这条信息上。很快联想到,有多少个斜扛(/)就应该对应多少目录,而且斜扛(/)会跟在每个目录名的最后。我们又想到了grep命令,还想到了应该怎样用正则表达式表示出匹配行尾,答案已经很接近了……
http://www.linuxidc.com/upload/2011_11/111112085691237.gif正则表达式" />
ls
这条短命令又一切成全了我们的梦想。"/$"
在此基础上,我们发散一下思维,比如说想统计当前目录下的文件个数及目录个数,就可以使用以下命令:
ls
ls
好了,暂且休息,下面我们开始介绍更多关于正则表达式的知识。
蓄势
前面我们初识了^
正则表达式是一个字符或和元字符组合成的字符集,它们匹配(或指定)一个模式。字符即普通字符(例如字符
在这里,为简单见,我们不会介绍所有的正则表达式知识,只介绍常用的一些正则表达式知识。
一个正则表达式包含下面一个或多个项:
1.一个字符集
这里的字符集里的字符表示的就是它们字面上的意思.正则表达式最简单的情况就是仅仅由字符集组成,而没有其他的元字符。
2.锚
一个锚指明了正则表达式在一行文本中要匹配的位置,例如^和$就是锚。
3.修饰符
它们用于展开或缩小(即是修改了)正则表达式匹配文本行的范围.修饰符包括了星号、括号和反斜杠符号。
* 匹配重复零次或多次前一字符
+ 匹配一个或多个前面的字符.它的作用和*很相似,但唯一的区别是它不匹配零个字
? 匹配零或一个前面的字符。它一般用于匹配单个字符
. 匹配任意字符(
^ 匹配一行的开头,但依赖于上下文环境,可能在正则表达式中表示否定一个字符
[...] 匹配集合中任意字符
[^...]
匹配不属集合
^,
\<,
\(...\) 正则表达式分组。进行子字符串提取(substring
\n 第
\ 转义(escapes)
\{
要转义是因为不转义的话大括号只是表示他们字面上的意思.这个用法只是技巧上
| "或",正则操作符用于匹配一组可选的字符
{n} n是一个非负整数。匹配确定的n次。例如,''o{2}''
{n,} n是一个非负整数。至少匹配n次。例如,''o{2,}''
{n,m} m和n均为非负整数,其中n<=m。最少匹配n次且最多匹配m次。例如,"o{1,3}"将匹配
\b 匹配一个单词边界,也就是指单词和空格间的位置。例如,''er\b''
\B 匹配非单词边界。''er\B''能匹配"verb"中的''er'',但不能匹配"never"中的
\w 匹配包括下划线的任何单词字符。等价于''[A-Za-z0-9_]''。
\W 匹配任何非单词字符。等价于''[^A-Za-z0-9_]''。
\d 匹配一个数字字符。等价于[0-9]。
\D 匹配一个非数字字符。等价于[^0-9]。
\f 匹配一个换页符。等价于\x0c和\cL。
\n 匹配一个换行符。等价于\x0a和\cJ。
\r 匹配一个回车符。等价于\x0d和\cM。
\s 匹配任何空白字符,包括空格、制表符、换页符等等。等价于[\f\n\r\t\v]。
\S 匹配任何非空白字符。等价于[^\f\n\r\t\v]。
\t 匹配一个制表符。等价于\x09
\v 匹配一个垂直制表符。等价于\x0b和\cK。
常用的就介绍到这里,其它的需要进一步了解可以查阅手册或资料。
翱翔
部分例子
/\b([a-z]+)\1\b/gi 一个单词连续出现的位置
/(\w+):\/\/([^/:]+)(:\d*)?([^#
/^(?:Chapter|Section)
/[-a-z]/ A至z共26个字母再加一个-号。
/ter\b/ 可匹配chapter,而不能terminal
/\Bapt/ 可匹配chapter,而不能aptitude
/Windows(?=95
下面来些更加高级些的例子。
对于vi
s/\(^.*$\)\n^.*$/\1/g
初一看,会傻眼,眼前感觉全是$^.*/\……这些符号的闪动。
不要紧,下面慢慢道来。
先给出vi中替换命令的格式。
s/re/string
如果在后面加了个g
表示表示对该行内符合模式的进行全部替换。
例如,s/\//_/g
好了,了解vi中替换命令的格式后,我们再对细节进行分析。
前面介绍到
s/\(^.*$\)\n^.*$/\1/g
中的
类推,\2就应该表示第二个正则表达式分组,即
好了,
%s/\(^.*$\)\n^.*$/\1/g
就可以写为:
s/AB/A/g
作用就是将行内所有的AB都替换成A。
现在我们来分别分析A和B的作用。
A=\(^.*$\)
抽取出来实际上是\(...\),表示正则表达式
B=\n^.*$
分析:
再于是就有:%s/AB/A/g
将两行(如行1和行2
从上面的分析过程中,我们总结出两条有用的正则表达式:
%s/\(^.*$\)\n^.*$/\1/g 删除偶数行
%s/^.*$\n\(^.*$\)/\1/g 删除奇数行
不过瘾的话,还可以再看看另一例子:
sed
\2就应该表示第二个正则表达式分组
同上,也将A=/\(.*\),B=\(.\)$,表达式变为's/AB/B',将AB都替换成B
分析A、B作用。
A=/\(.*\)
抽取出来实际上是\(...\),表示正则表达式
B=\(.\)$
括号内的
于是sed
好了,正则表达式的介绍就告一段落,知识点比较多,需要平时反复的积累,遇到复杂的正则表达式时首先要克服恐惧的心理,然后按照上面的方法化繁为简,抓住其本质的东西,有如探囊取物,必手到擒来。
shell命令执行的相应顺序&&
命令1
&&
命令2
mv myfile myfile2 && echo "if you are seeing this then mv was success!"
||
如果||左边的命令(命令1)未执行成功,那么就执行||右边的命令(命令2)
mv myfile myfile2 && echo "if you are seeing this then mv was success! "
从一个审计文件中抽取第1个和第2个域,并将其输出到一个临时文件中,如果这一操作未成功,我希望能够收到一个相应邮件:
awk '{print$1,$2}' test3 >test2 || echo "sorry the extraction didn't work " | mail root
(命令1;命令2;. . .)
如果使用{ }来代替(),那么相应的命令将在子s h e l l而不是当前s h e l l中作为一个整体被执行,只有在{ }中所有命令的输出作为一个整体被重定向时,其中的命令才被放到子s h e l l中执行,否则在当前s h e l l执行。
例子:
如果s o r t命令执行成功了,可以先将输出文件备份,然后再打印
test.sorted && (cp test.sorted test.sorted_bak ;lp test.sorted)
经常使用的正则表达式举例
^
$
^ [ t h e
]
[ S s ] i g n a [ l L
]
[Ss]igna[lL]".
[ m a y M A Y
]
^ U S E R
$
[tty]$
"
.
^ d . . x . . x . .
x
^ [ ^ l
]
^[^d]
[ . * 0
]
[ 0 0 0 *
]
[
iI]
[ i I ] [ n N
]
[ ^ $
]
[ ^ . * $
]
^ . . . . . .
$
[a-
zA-Z]
[ a - z ] [ a - z ] *
[ ^ 0 - 9 " $
]
[ ^ 0 - 0 A - Z a - z
]
[ 1 2 3
]
[ D d ] e v i c
e
D e . . c
e
" ^
q
^ .
$
^".[0-9][0-9]
' " D e v i c e " '
D e [ V v ] i c e " .
[ 0 - 9 ] " { 2 " } - [ 0 - 9 ] " { 2 " } - [ 0 - 9 ] " { 4 "
}
[ 0 - 9 ] " { 3 " } " . [ 0 - 9 ] " { 3 " } " . [ 0 - 9 ] " { 3 " } " . [ 0 - 9 ] " { 3 " } I P地址格式
[ ^ . * $
]
[A-Za-z]*
常用的g r e p选项
-c
-i
-h
-l
-n
-s
-v
例子
grep -v "Sort"
tab2
grep -n "Sort"
tab2
grep -c "Sort"
tab2
精确匹配:
grep -in "code"
tab2
多次过滤
grep -in "code" tab2 | grep "02"
使用grep匹配“与”或者“或”模式
g r e p命令加- E参数,这一扩展允许使用扩展模式匹配。例如,要抽取城市代码为2 1 9或2 1 6,方法如下:
grep –E ‘219|216’ tab2
g r e p允许使用国际字符模式匹配或匹配模式的类名形式。
类
[ [ : u p p e r : ]
]
[ [ : a l n u m : ]
]
[ [ : l o w e r : ]
]
[ [ : s p a c e : ]
]
[ [ : d i g i t : ]
]
[ [ : a l p h a : ]
]
大多数系统管理员称
要查看D N S服务器是否正在运行(通常称为n a m e d),方法如下
ps -ef | grep
"name"|grep -v "grep"
(2)

加载中…