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...