正则表达式在GREP使用的方法和技巧
1、 正则表达式的基本概念
Grep 是查找的一个基本命令 文本处理工具: 根据用户指定的文本模式,对目标文件进行逐行搜索,并显示匹配。
正则表达式是一类字符所书写的模式,其中许多字符不表示其字面意义,而是表达控制或通配等功能。
2、正则表达式分类:
基本正则表达式和扩展正则表达式
基本正则表达式
grep [OPTIONS] PATTERN [FILE...
元字符:
字符匹配:
.:匹配任意字符
.*:任意长度的任意字符
[]:匹配范围内的字符
如[0-9],------表示0到9中的任意一个字符
字符集合:
[:space:]表示任意空白字符
[:punct:] 所有的标点符号
[:lower:]所有小写字母
[:upper:]所有大写
[:digit:]所有数字
[:alnum:]所有数字和字母
[:alpha:]所有字母
*:任意长度,它面前的字符可以出现任意次;例如:x*y
\?:0次或1次,它前面的字符是可有可无的;例如:x\?y
\{m\}:m次,它前面的字符可以出现m次;
\{m,n\}:至少m次,至多n次
\{m,\}:至少m次
\{0,n\}:至多n次
位置锚定符号:
^:行首设定,
$:行尾设定,
^$:空白行
\<:词首
\>:词尾
分组字符:
\(\):分组字符---分组默认编号为自左而后编号
\#:引用第n个括号所匹配到的内容,而非模式本身;
如:(abc)(123)* \1\2 ----这里的引用\1引用为(abc)的内容;\2引用为(123)的内容
例如:
1、在一个qq库中提出8-11位的QQ号码有那些?
grep "\<[0-9]\{8,11\}\> " qq
2、例如:提取a.txt中出现一位单位数的行
grep "\<[0-9]\{1,\}\>" /home/a.txt
3、显示/etc/passwd文件中默认shell为/bin/bash的用户
4、显示/boot/grub/grub.conf中以至少一个空白字符的行
5、添加用户bash,sync,halt,而找出当前系统上其用户名和默认shell相同的用户
grep "^\([[:alnum:]]\{1,\}\):.*\1$"/etc/passwd
6、在/etc/inittab中显示以#号开头后跟至少2个空白字符的行
扩展正则表达式:
grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...]
字符匹配:
.:任意字符
[]:
[^]:内容取反如:非空白字符开头的行―[^[:space:]]
次数匹配:
*:任意次
?:0或1次
+:至少一次
{m}:精确匹配每次
{m,n}:至少m次,最多n次
{m,}:至少出现m次
{0,n}:最多出现n次
位置锚定:设置要搜索的位置
^:行首锚定
$:行尾锚定 ---如^$表示空白行
\<:词首锚定
\>:词尾锚定
分组设定:
():括起来的内容以组的形式,依次匹配
\#:引用: \1,\2,\3
(abc)(123)* \1\2 ----这里的引用\1引用为(abc)的内容;\2引用为(123)的内容 |:或者
a|b:a或者b
7、显示当前系统上root、bash或user1 用户的默认shell
grep�E "^(root|bash|user1):" /etc/passwd
8、找出/etc/rc.d/init.d/functions文件中某单词后跟一组小括号“()”行;
grep -o -E "\<[[:alpha:]]+\>\(\).*" /etc/rc.d/init.d/functions
9、使用echo命令输出一个路径,而后使用grep取出其基名;
echo "/etc/passwd" | grep -o -E "[[:alnum:]]+/?"
10、找出ifconfig命令结果中的1-255之间的数字
ifconfig | grep -o -E"\<[1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5]\>"
11、写一个模式,能匹配合理的IPV4地址;