grep, egrep, fgrep
语法格式:
grep [option] ... 'PATTERN' FILE
--color=auto
对目标FILE进行搜索,显示能够匹配的行
正则表达式
基本正则: grep
扩展正则: grep -E 或者 egrep
fgrep: fast但是不支持正则表达
基本正则表达式的元字符:
字符匹配:
. 匹配任意单个字符
[] 匹配指定范围内的单个字符
[0-9], [[:digit:]] 单个数字
[a-z], [[:lower:]] 单个小写字符
[A-Z], [[:upper:]] 单个大写字符
[[:space:]] 单个空白字符
[[:punct:]] 单个标点符号
[[:alpha:]] 单个字母
[[:alnum:]] 单个字母或者数字
[^] 表示取反
次数匹配元字符: 用于实现指定其前面的字符所能够出现的次数
* 任意长度, 他前面的字符可以出现任意次
例如: x*y
可匹配: xy, xyy, y
\? 0次或1次, 它前面的字符是可有可无的
例如: x\?y
可匹配: xy, y, ay
\{m\} m次, 它前面的字符要出现m次
例如: x\{2\}y
可匹配: xxy, xxxy
\{m,n\} 至少m次,至多n次
例如: x\{2,5\}y
可匹配: xxy, xxxy, xxxxy, xxxxxy
\{m,\} 至少m次
\{0,n\} 至多n次
.* 任意长度的任意次
工作于贪婪模式: 尽可能多的去匹配
位置锚定:
^ 行首锚定:
写在模式最左边
$ 行尾锚定:
写在模式最右边
^$ 空白行
单词 - 不包含特殊字符的连续字符组成的串
\< 词首, 出现于单词左侧
\> 词尾, 出现于单词右侧
分组:
\(\)
例如: \(ab\)*
可匹配 ababababab
分组中的模式匹配到的内容, 可由正则表达式引擎记忆在内存中,之后可被引用
引用:
例如 \(ab\(x\)y\).*\(mn\)
括号是有编号的, 自左向右的左括号,以及与其匹配的右括号中间的内容
数左括号
\# 引用第n个括号所匹配到的内容, 而非模式本身
例如 \(ab\?c\).*\1
这里的\1 代表的是\(ab\?c\) 匹配到的内容
比如abcxxxxabc,可以被匹配到
先匹配abc,然后正则将分组中匹配到的abc记录到内存中,匹配.*, 然后继续调用\1,为abc才匹配
abcmnaaa
abcmnabc
abcmnac
acxyac
或者:
(|)
a|b: a或者b
命令选项:
-v: 反向选取
eg: 全选非空白行 grep -v "^$" /etc/issue
-o: 仅显示匹配的字符串,而非字符串所在的行
-i: 忽略字符大小写
-i "cat" 则每一个字符都不区分大小写, Cat CAt cAt cAT都满足
-E: 支持使用扩展正则表达式
-A # 同时显示匹配内容的后一行
-B # 同时显示匹配内容的前一行
-C # 同时显示匹配内容的前后各一行
练习:
1、显示/proc/meminfo文件中以大写或小写S开头的行;
#grep "^[sS]" /proc/meminfo
#grep -i "^s" /proc/meminfo
#grep -E "^(s|S)" /proc/meminfo
2、显示/etc/passwd文件中其默认shell为非/sbin/nologin的用户;
#grep -v "/sbin/nologin" /etc/passwd
3、显示/etc/passwd文件中其默认shell为/bin/bash的用户;
进一步:仅显示上述结果中其ID号最大的用户;
#grep "bin/bash" /etc/passwd
#grep "bin/bash" /etc/passwd | sort -n -t: -k3 | tail -1
4、找出/etc/passwd文件中的一位数或两位数;
#grep "\<[0-9][0-9]\?\>" /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$" ???
8、添加用户bash, testbash, basher, nologin(SHELL为/sbin/nologin),而找出当前系统上其用户名和默认shell相同的用户;
#grep "^\([[:alnum:]]\{1,\}\):.*\1$" /etc/passwd
先锚定行首,匹配至少一个数字或字母,并分组,加上第一个:,然后任意字符,最后行尾匹配\1
9、扩展题:新建一个文本文件,假设有如下内容:
He like his lover.
He love his lover.
He like his liker.
He love his liker.
找出其中最后一个单词是由此前某单词加r构成的行。
=====================================================================
练习:使用扩展的正则表达式
10、显示当前系统上root、fedora或user1用户的默认shell;
#egrep 'root|richie|jingming' /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 -E "[^/]+/?$"
非反斜线的字符至少。*一个匹配到行尾
13、找出ifconfig命令结果中的1-255之间的数字;
#ifconfig | egrep "\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>"
14、挑战题:写一个模式,能匹配合理的ipv4地址;
1.0.0.1-239.255.255.255
============================================================================
博客作业, 写清楚grep和egrep的各个元字符的意义和给出实例说明用法
基本正则表达式:
字符匹配:
. 匹配单个任意字符
[] 匹配指定范围内的任意单个字符
[^]匹配到的内容取反
eg: [^M]
次数匹配:
* 在*符号的前一个字符可以出现任意次
\? 在\?符号的前一个字符可以出现0次或者1次
\{m\} 在\{m\}符号之前的那个字符,必须出现m次
\{m,n\} 在\{m,n\}符号之前的那个字符,可以出现最少m次,最多n次
\{m,\} 在\{m,\} 符号之前的那个字符, 至少出现m次
\{0,n\} 在\{0,n\} 符号之前的那个字符,至多出现n次
.* 匹配任意长度的任意字符
工作于贪婪模式,系统会尽可能的去多匹配符合的
位置锚定
^ 锚定行首
$ 锚定行尾
^$ 锚定空行
单词: 不包含特殊字符的连续字符组成的串
\< 词首, 出现于单词的左侧 \b也可
\> 词尾, 出现于单词的右侧 \b也可
分组:
\(\)
分组中的模式匹配到的内容, 可以又正则表达式引擎记忆在内存中, 之后可以再次以 \#的形式被引用
引用:
()是有编号的: 自左向右的左括号,以及与其匹配的右括号
\#: 引用第n个括号所匹配到的内容,而非模式本身
例如文件内内容为:
abcmnxabcmnx
abcmnxbc
abcmnxc
abcmnxx
eg: \(a\(b\(c\)\)mn\(x\)\).*\#
\1 引用到的内容就是\(a\(b\(c\)\)mn\(x\)\)匹配的内容为
abcmnxabcmnx
\2 引用到的内容就是\(b\(c\)\) 匹配到的内容为
abcmnxbc
\3 引用到的内容就是\(c\) 匹配到的内容
abcmnxc
\4 引用到的内容就是\(x\) 匹配到的内容
abcmnxx
工作于贪婪模式,系统会尽可能的去多匹配符合条件的内容。
所以实际上,一些子串也会被匹配到
grep命令
grep [options] PATTERN [FILE...]
grep [options] [-e PATTERN] -f [FILE] [FILE...]
-v 反向选取
-o 仅显示匹配的字串, 而非字串所在的行
-i ignore-case, 忽略大小写
-E 支持使用扩展正则表达式
-A # after-context
-B # before-context
-C # context
==================================================================
扩展正则表达式:
字符匹配:
.
[]
[^]
次数匹配:
*
?
+
{m}
{m,n}
{m,}
{0,n}
位置锚定:
^
$
\<, \b
\>, \b
^$
分组:
()
引用: \1, \2, \3 ...
或者:
a|b a或者b
eg:conC|cat是 concat或conCat? no
还是conC 或cat?? yes
con(C|c)at 是conCat或concat
egrep命令
grep -E 'PATTERN' FILE...
egrep 'PATTERN' FILE...