正则表达式
是一类字符所书写的模式,其中许多字符不表示其字面意义,而是表达控制或通配等功能;正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。在很多文本编辑器里,正则表达式通常被用来检索、替换那些符合某个模式的文本。
元字符:不表示其字面意义,而用于额外功能性描述,下面是常用的元字符列表
符号 | 含义 |
. | 表示匹配任意单个字符,例a.,匹配ab、ac、ad、ax |
* | 表示它前面的字符可以出现任意次,例a*b,匹配aab、b、ab |
\? | 表示它前面的字符可有可无,例a\?b,匹配ab、b、xb |
\{m\} | 表示它前面的字符出现m次,例a\{2\}b,匹配aab、aaaab、aaaaaabbbb |
\{m,n\} | 表示它前面的字符至少出现m次,最多出现n次,例a\{2,5\}b,匹配aab、aaab、 |
\{m,\} | 表示它前面的字符至少出现m次,例a\{2,\}b,匹配aab、aaaaaaaaaaaabbbbb |
\{0,n\} | 表示它前面的字符最多出现n次,例a\{0,3\}b,匹配b、aab、aaaaabbbbb |
.* | 表示任意长度的任意字符,贪婪模式,尽可能多的去匹配 |
^ | 表示行首锚定,例^a,表示以a开头的行 |
$ | 表示行尾锚定,例$a,表示以a结尾的行 |
^$ | 表示空白行 |
\< | 表示词首锚定,出现于单词左侧 单词:不包含特殊字符的连续字符组成的串叫单词 |
\> | 表示词尾锚定,出现于单词右侧 |
\# | 引用第n个括号所匹配到的内容,而非模式本身,例\(ab\).*\1,匹配absdfdfab |
+ | 表示它前面的字符至少出现一次 |
Linux grep及egrep
grep (global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。
扩展正则表达式:egrep或grep -E
基本正则表达式:grep
常用参数:
-v: 反向选取
-o: 仅显示匹配的字串,而非字串所在的行
-i: ignore-case,忽略字符大小写
-E: 支持使用扩展正则表达式
egrep和grep最大的区别:egrep是grep 的扩充版, 改良了许多传统 grep 不能或不便的操作. 比方说:
- grep 之下不支持 ? 与 + 这两种 modifier, 但 egrep 则可.
- grep 不支持 a|b 或 (abc|xyz) 这类"或一"比对, 但 egrep 则可.
- grep 在处理 {n,m} 时, 需用 \{ 与 \} 处理, 但 egrep 则不需.
例题
1、显示/proc/meminfo文件中以大写或小写S开头的行;
# grep -i ‘^s‘ /proc/meminfo
# grep ‘^[Ss]‘ /proc/meminfo
# grep -E ‘^(S|s)‘ /proc/meminfo
2、显示/etc/passwd文件中其默认shell为非/sbin/nologin的用户;
# grep -v "/sbin/nologin$" /etc/passwd | cut -d: -f1
3、显示/etc/passwd文件中其默认shell为/bin/bash的用户;
进一步:仅显示上述结果中其ID号最大的用户;
# grep "/bin/bash$" /etc/passwd | sort -t: -k3 -n | tail -1 | cut -d: -f1
4、找出/etc/passwd文件中的一位数或两位数;
# grep "\<[0-9][0-9]\?\>" /etc/passwd
# grep "\<[0-9]\{1,2\}\>" /etc/passwd
5、显示/boot/grub/grub.conf中以至少一个空白字符开头的行;
# grep "^[[:space:]]\{1,\}" /boot/grub/grub.conf
6、显示/etc/rc.d/rc.sysinit文件中,以#开头,后面跟至少一个空白字符,而后又有至少一个非空白字符的行;
# grep "^#[[:space:]]\{1,\}[^[:space:]]\{1,\}" /etc/rc.d/rc.sysinit
7、找出netstat -tan命令执行结果中以‘LISTEN‘结尾的行;
# netstat -tan | grep "LISTEN[[:space:]]*$"
8、添加用户bash, testbash, basher, nologin(SHELL为/sbin/nologin),而找出当前系统上其用户名和默认shell相同的用户;
# grep "^\([[:alnum:]]\{1,\}\):.*\1$" /etc/passwd
10、显示当前系统上root、fedora或user1用户的默认shell;
# grep -E "^(root|fedora|user1):" /etc/passwd | cut -d: -f7
11、找出/etc/rc.d/init.d/functions文件中某单词后跟一组小括号“()”行;
# grep -o -E "\<[[:alnum:]]+\>\(\)" /etc/rc.d/init.d/functions
12、使用echo命令输出一个路径,而后使用grep取出其基名;
echo "/etc/sysconfig/" | grep -o -E "[[:alnum:]]+/?"
# echo "/etc/sysconfig/" | grep -o -E "[^/]+/?$" | cut -d/ -f1
13、找出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])\>"
本文出自 “鱼儿” 博客,请务必保留此出处http://kyfish.blog.51cto.com/1570421/1437655
菜鸟的成长记录--linux正则表达式及grep,布布扣,bubuko.com
原文:http://kyfish.blog.51cto.com/1570421/1437655