标签:grep 正则表达式
什么是grep
grep全名是Global seach REgular expressionand Print out the line.(全面搜索正则表达式并且显示出来),是一种强大的文本搜索工具,根据用户的文本模式(搜索条件)对目标文件进行逐行搜索,并显示能匹配到(或者不匹配)的行或文本。
既然grep是全面搜索正则表达式并显示,那正则表达式是什么呢?
正则表达式
正则表达式,(英语:RegularExpression,在代码中常简写为regex、regexp或RE),是一类字符所书写的模式,其中许多字符不表示字意义,而是表达控制或通配的功能。
正则表达式是由普通的字符和元字符组成,所谓元字符就是不表示其字面意义,而用额外功能性描述。正则表达式的搜索能力是由程序实现的,所以处理正则表达式的工具又称为正则表达式引擎。很多语言都支持正则表式,只是所支持方式略有不同而已。
正则表达式分为基本正则表达式和扩展正则表达式,不同的扩展正表达式支持功能多一点,grep支持基本正则表达式,egrep(grep -E) 支持扩展正则表达式,而fgrep不支持正则表达式。
基本正则表达式(grep)
语法格试:
grep[OPTIONS]... PATTERN [FILE...]
基本正则表达式的元字符
1,字符匹配:
.: 匹配任意单个字符
[]: 匹配指定范围内的任意单个字符
[^]: 匹配指定范围外的任意单个字符
[0-9],[[:digit:]] : 匹配单个数字
[a-z], [[:lower:]] : 匹配单个小字字母
[A-Z],[[:upper:]] : 匹配单个大字字母
[a-zA-Z],[[:alpha:]] : 匹配单个不区分大小写的字母
[0-9a-zA-Z],[[:alnum:]] : 匹配简个数字或不区分大小写的字母
[[:space:]]: 匹配单个空白字符,包括空格,tab
[[:punct:]]: 匹配单个标点符号
2,次数匹配元字符:用于实现指定其前的字符所能够出现的次数
*:任意长度,它前面的字符可以出现任意次
\?:0次或1次,它前面的字符是可有可元的
\{m\}:它前面的字符要现m次
\{m,n\}:它前面出现的字符至少m次,最多n次
\{m,\}:它前面出现的字符至少m次
\{0,n\}:它前面出现的字符最多n次
.*:匹配任意长度的任意字符
\+:它前面出现的字符1次以上
3,位置锚定:
^:行首锚定:写在模式最左侧
$:行尾锚定:写在模式最右侧
^$:空白行
\<,\b:词首锚定,出现于单词左侧
\>,\b:词尾锚定,出现于单词右侧
注意:不包含特殊字符的连续字符组成叫单词
4,分组
\(\): 比如 \(bash\)
分组中的模式匹配到内容,可由正则表达式引擎记忆在内存中,之后可以被引用
5,引用
\#:引用前面的第#个左括号以及与与其匹配右括号中的模式所匹配到的内容
\|:比如,a\|b a或者b
扩展正则表达式(egrep)
语法格式:
egrep[option]... ‘PATTERN‘ FILE...
grep-E
扩展正则表达式元字符:
1,字符匹配
.:匹配任意单个字符
[ ] : 匹配指定范围内的任意单个字符
[^]: 匹配指定范围外的任意单个字符
2,次数匹配
*:任意长度,它前面的字符可以出现任意次
?:0次或1次,它前面的字符是可有可元的
+:它前面出现的字符1次以上
{m}:它前面的字符要现m次
{m,n}:它前面出现的字符至少m次,最多n次
{m,}:它前面出现的字符至少m次
{0,n}:它前面出现的字符最多n次
3,位置锚定:
^:行首锚定:写在模式最左侧
$:行尾锚定:写在模式最右侧
^$:空白行
\<, \b:词首锚定,出现于单词左侧
\>, \b:词尾锚定,出现于单词右侧
4,分组
():分组
|:或
5,引用:
\#:引用前面的第#个左括号以及与与其匹配右括号中的模式所匹配到的内容
grep, egrep 命令选项
-o:仅显示匹配的字串,而非字串所在的行
-v:反向选取
-i:ignore-case,忽略字符大小写
-A:-A # ,显示匹配到的行,还要显示匹配到的行下面#行
-B:-B #,显示匹配到的行,还要显示匹配到的行上面#行
-C:-C #,显示匹配到的行,还要显示匹配到的行各上下#行
--color=auto:匹配到的内容,默认以红色显示
举例:
1,显示/etc/passwd文件中其默认shell为非/sbin/nologin的用户
# grep "/sbin/nologin" -v/etc/passwd | cut -d: -f1
2,显示/etc/passwd文件中其默认shell为/bin/bash的用户,仅显示上述结果中ID号最大的用户
# grep ‘/bin/bash‘ /etc/passwd | sort -t:-k3 -n | tail -1 |cut -d: -f1
3,找出/etc/passwd文件中的一位数或两数
# grep -E --color "\<[0-9]{1,2}\>" /etc/passwd
4,显示/etc/rc.d/rc.sysinit文件中,以#开头,后面跟至少一个空白字符,而后还跟至少一个非空白字符
# grep -E "^#[[:space:]]+[^[:space:]]+" /etc/rc.d/rc.sysinit --color
5,找出当前系统上其用户名和默认shell相同的用户
# grep -E --color"^(\<[[:alpha:]]+[[:alnum:]]*\>).*\1$" /etc/passwd
6,找出/etc/rc.d/init.d/functions 文件中某单词后跟一组小括号"()"行:
# grep-E --color -o "\<[[:alpha:]]+\>\(\)" /etc/rc.d/init.d/functions
7,使用echo 命令输出一个路径,而后使用grep取出其基名
echo "/etc/sysconfig/network" |grep -o -E "[^/]+/?$" | cut -d/ -f1
8,写一个模式,能匹配合理的ipv4地址(1.0.0.1-239.255.255.254)
ifconfig | grep -o -E"([1-9]|[1-9][0-9]|1[0-9]{2}|2[0-3][0-9])(\.([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])){2}\.([1-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-4])"
标签:grep 正则表达式
原文地址:http://jadon.blog.51cto.com/4998323/1626280