Linux 正则表达式解析
一.Linux文本搜索工具
Linux的文本搜索工具主要有grep,egrep,fgrep。其中grep支持基本和扩展的正则表达式的搜索。egrep支持扩展的正则表达式。fgrep不支持正则表达式的搜索,但是它的搜索速度比较快。这里我们具体探讨一下grep和egrep使用方法。
1.1grep用法
grep [OPTIONS] PATTERN [FILE...]
--color={never,auto,always}:是否对搜索到字符串做颜色处理。
-o :只显示被模式匹配到的内容
-i :搜索时忽略大小写
-v :显示不能被模式匹配的行
-E :使用扩展的正则表达式
-A 1:显示被匹配到的行以及它的下一行
-A 2:显示被匹配到的行以及它的下两行
1.2egrep用法
同 grep -E用法一样,支持扩展表达式
二.正则表达式
简单的说正则表达式就是处理字符串的方法。它是一些由元字符和正常字符所组成的模式。可以让用户轻易达到查找,删除,替换某特定字符串的目的。正则表达式分为基本正则表达式和扩展正则表达式。
2.1基本正则表达式的元字符:
2.1.1.字符单个匹配:
.:表示匹配任意单个字符
[]:匹配指定范围内的任意单个字符,如匹配0-9之间的数字的写法为[0-9], 匹配a-z之间的任意字符为[a- z],匹配A-Z之间的字符为[A-Z]。
[^]:匹配指定范围之外的任意单个字符,如匹配不是a-z之间的任意字符可以写为[^a-z].
2.1.2次数匹配:
*:表示字符出现的次数,可以是一次,可以是零次,亦可以是多次。任意字符出现任意次数的写法 是.*;(不包括后面的分号,注意前面有一个点号)
例:显示/etc/passwd文件下有数字9的行:
\?:匹配其前的字符零次,或一次。表示其左侧的字符可有可无。”ab\?”表示a出现一次且b出现零次或一 次,a,ab,abc,ac都能匹配成功。
例:显示/etc/passwd文件中有h,sh,这两种字符串的行
\+:表示其前的字符可以出现一次或多次。
\{m\}:精确匹配其左侧的字符m次
\{m,n\}:其左侧字符至少出现m次,之多出现n次
例:显示/etc/passwd文件中字母o至少连续出现2,至多出现4次的行
2.1.3.位置确定:
^:确定行首,意思是其后跟的字符或字符串(需用括号括上)必须在行首。 比如, 现在我们需要查找 以s开头的行,可以写成^s
例:在/etc/passwd文件中显示以字母s开头的行
$:确定行尾,意思是其前跟的字符或字符串必须在行尾出现。
例:在/etc/passwd文件中显示以字母c结尾的行
2.1.4.单词确定:
\<:用来确定词首,表示其后出现的字符或字符串必须出现在单词的开头。也可用\b
\>:用来确定词尾,表示其前出现的字符或字符窜必须出现在词尾。
例:在/etc/passwd文件中显示有root单词的行
2.1.5.分组:
\( \):把括号内的字符或字符串当做一个整体来匹配。
例:显示在/tmp/test.txt(自己创建的文件)文件中显示有abcabc的行
注:在某次的具体匹配过程中,匹配到的字符可以被grep记忆(这些字符被记在内置的变量中,这些变量 用\1,\2,\3……表示)
\1:引用模式中自左向右第一个左括号以及与之对应的右括号之内的内容。
\2:引用模式中自左向右第二个左括号以及与之对应的右括号之中的内容。
\3:根据上面的\1,\2类推。
例:/tmp/test2.txt文件中内容为
写一个模式匹配,要求能够找出上图中如前面出现like,后面也出现like,前面出现love,后面也出 现love的行。
2.2扩展正则表达式元字符
字符匹配:.(这里有一个点号),[],[^]与基本正则表达式的意义和用法一样。
次数匹配:
*:与\*的意义一样,表示次数为任意次
?:与\?的意义一样,代表匹配0次或1次
+:与\+的意义一样,代表至少匹配1次
{m}:与\{m\}意义一样代表精确匹配m次
{m,n}:匹配至少m次,至多n次
位置确定:
^:确定行首
$:确定行尾
单词确定:
\<:确定词首
\>:确定词尾
分组:
():同\(\)意义和用法一样
“或”匹配:
a|b:匹配a或者匹配b
三.练习
例:显示/proc/meminfo文件中大写或小写S开头的行
例:显示/etc/passwd文件中其默认shell为非/sbin/nologin的用户
例:显示/etc/passwd文件中默认shell为/bin/bash
例:找出/etc/passwd文件中一位或两位数字的行
例:显示/boot/grup/grup.conf中至少一个空白符开头的行
例:显示/etc/rc.d/rc.sysinit文件中以#开头,后面至少跟一个空白符,而后又至少跟一个非空白符的行
例:找出netstat -tan 命令执行结果中有’LISTEN’ 的行
例:添加用户bash,testbash,basher,nologin. 然后找出当前系统上用户名和默认shell名称一样的行
例:找出/etc/rc.d/init.d/functions文件中单词后面跟一组括号的行。形如 hello().
例:找出ifconfig命令结果中1-255的数字
原文地址:http://fengmei.blog.51cto.com/9154246/1628945