一、grep简介

Linux上的文本处理工具三剑客:

# grep:文本过滤工具

# sedstream editor,流编辑器;文本编辑器。

# awkLinux上的实现gawk,文本报告生成器。

 

正则表达式:regular experssion REGEXP  由一类特殊字符及文本字符所编写的模式,其中有些字符不表示其字面意义,而是用于表示控制或通配的功能;

1.基本正则表达式:BRE

2.扩展正则表达式:ERE

两者的不同之处在于元字符不同。元字符:不能被切割,用于控制或通配的功能

 

grep Global search REgular expression and Print out the line

工作机制:以行为单位进行字符串的处理,通过用户指定的模式进行匹配检查,可以让用户轻松搜索或替换某些特定的字符串。

模式:由正则表达式的元字符及文本字符所编写出的过滤条件;

作用:文本搜索工具,根据用户指定的“模式(过滤条件)”对目标文本逐行进行匹配检查;打印匹配到的行。

 

二、grep命令

grep, egrep, fgrep - print lines matching a pattern

grep 命令:

grep [OPTIONS] PATTERN [FILE...]

grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...]

-i, 忽略大小写

-o,仅显示匹配到字符串本身

-v,显示不被匹配到的行

-E,支持使用扩展的正则表达式元字符

-q, quiet, --silent:静默模式,即使匹配到,也不输出任何信息,

[root@localhost ~]# grep -q "bash" /etc/passwd

[root@localhost ~]# echo $?     执行状态信息

0

-A #:after,后#

-B #:before,前#

-C #:context,前后各#行   grep -C 3 bash /etc/passwd

基本正则表达式:

字符匹配:

.:匹配任意单个字符

[]:匹配指定范围内的任意单个字符  [^] 取反 ^[] 行首

[:digit:][:lower:] [:upper:] [:alpha:] [:punct:] [:space:]

匹配次数:

*)表示“重复0个或多个前面的RE字符”(o*)表示空字符或一个o以上的字符。(oo*)表示第一个o要存在,第二个o可有可无。则含有一个o以上的都要列出来。

.*: 匹配任意长度的任意字符

\?:匹配前面的字符0次或1次,即前面的字符可有可无。

\+:匹配前面的字符至少一次

\{m\}:匹配前面字符m

\{m,n\}:匹配前面字符mn

\{0,n\}至多n

\{m,\}至少m

位置锚定:

^:行首锚定:用于模式的最左侧  $:行尾锚定:用于模式的最右侧;

^$:空白行:不包含任何字符和空白字符  ^[[:space:]]*$:空行或包含空白字符的行

单词:非特殊字符组成的连续字符都称为单词

\<\b:词首锚定,用于单词模式的左侧

\>\b:词尾锚定,用于单词模式的右侧

\<PATTERN\>:匹配完整单词

 

分组及引用

\(xy\)*ab   转义字符\

\(\):将一个或多个字符捆绑在一起,当做一个整体进行处理。

注意:分组括号中的模式匹配到内容会被正则表达式引擎自动记录于内部的变量中。

\1:模式从左侧起,第一个左括号以及与之匹配的右括号之间的模式所匹配到的字符;

\2:……第二个左括号……

grep "\(l..e\).*\1" grep.txt

 

后向引用:引用前面的分组括号中的模式所匹配到的字符。

#egrep :支持扩展的正则表达式实现类似于grep文本过滤功能;grep -E

egrep [OPTIONS] PATTERN [FILE...]

选项:-i-o-q-A,-B,-C , -G:支持基本正则表达式

扩展正则表达式的元字符:

字符匹配:.:任意单个字符;[]:指定范围内的任意单个字符;[^]:指定范围外的任意单个字符。

次数匹配:*:任意次;?:0次或1次,即之前字符可有可无;+:其前字符m次;{m}:之前字符m次;{m,n}:至少m次,至多n次。

位置锚定:^:行首锚定$:行尾锚定;^$:空白行:不包含任何字符和空白字符           ^[[:space:]]*$:空行或包含空白字符的行

\<\b:词首锚定,用于单词模式的左侧

\>\b:词尾锚定,用于单词模式的右侧

\<PATTERN\>:匹配完整单词

 

分组及引用:():分组;括号内的模式匹配到的字符会被记录于正则表达式引擎的内部变量中;后向引用:\1, \2, ...

# fgrep:不支持正则表达式元字符

当无需要用到元字符去编写模式时,使用fgrep必能更好。

 

练习2

1、显示/etc/passwd文件中不以/bin/bash结尾的行

# grep -v /bin/bash$ /etc/passwd

2、找出/etc/passwd文件中的两位数或三位数

# grep \< [[:digit:]]\{2,3}\> /etc/passwd

3、找出/etc/rc.d/rc.sysinit/etc/grub2.cfg文件中,以至少一个空白字符开头,且后面非空白字符的行

# grep [[:space:]]\+[^[:space:]] /etc/grub2.cfg

4、找出"netstat -tan"命令的结果中以'LISTEN'后跟01或多个空白字符结尾的行

# netstat -tan | grep \<LISTEN[[:space:]]*$

 

练习3

1、找出/proc/meminfo文件中,所有以大写或小写S开头的行;至少有三种实现方式;

# egrep -i ^s /proc/meminfo   egrep ^[pP]  egrep ^(s|S)

2、显示当前系统上rootcentosuser1用户的相关信息;

#  egrep  \<(root|centos|user1\>

3、找出/etc/rc.d/init.d/functions文件中某单词后面跟一个小括号的行;

# egrep -o [[:alpha:]]+\(\)

4、使用echo命令输出一绝对路径,使用egrep取出基名;

#echo /etc/sysconfig | egrep -o [^/]+/?$

取出其路径名:  ^/.*/

5、找出ifconfig命令结果中的1-255之间的数值;egrep [1-9]?[0-9]?[0-9]?

6、添加用户bash, testbash, basher以及nologin(shell/sbin/nologin);而后找出/etc/passwd文件中用户名同shell名的行;