grep(模式匹配器)详解

grep是一个文本搜索工具,用于根据用户指定的模式搜索文本并显示匹配的行。egrep使用扩展正则表达式,而fgrep直接查找指定字符串。grep的选项包括对模式的搜索,通配符如次数匹配和位置锚定符。egrep和fgrep各有特点,egrep允许更复杂的模式,fgrep则不解析正则表达式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、grep, egrep, fgrep的区别

grep(global search regular expression and prind out the line)全称就叫全面搜索正则表达式并打印行出来,简单来说就是文本搜索工具,根据用户指定的文本搜索模式对目标文本进行搜索,显示能够所匹配的行,当然,也可以把grep看也是一个文本过虑器、模式匹配器。

egrep:使用扩展正则表达式来构建模式,相当于grep –E、通常写成egrep、用法基本上跟grep的相同、只是有些不需要 \ 转译。

fgrep:fash,它不解析正则表达式、想找什么就跟什么就可以了。

2、grep的常用选项

grep: 根据模式搜索文本,并将符合模式的文本行显示出来。
Pattern: 文本字符和正则表达式的元字符组合而成匹配条件。

grep [options] PATTERN [FILE...]

	-i:不区分大小写对文本进行匹配搜索
	--color:显示颜色
	-v:显示没有被模式匹配到的行
	-o:只显示被模式匹配到的字符串	
    -E: 使用扩展正则表达式
	-A #:显示模式匹配到的行以及后面的N行 #代表你要显示多少行
	-B #: 显示模式匹配到的行以及前面的N行
	-C #:显示模式匹配到的行以及上下的N行

注意:
模式当中一但包含元字符一定要用’'或"“号引起来,单双引号都可以、只不过如果其中出现了变量、并且我们希望做变量替换的话那就要使用”"双引号了、否则可以不加区分的使用。

3、通配符

.(点号):匹配任意的单个字符的

[^]:表示指定范围外的任意单个字符、就是使用了脱字符取反

[]:指定范围内的任意的单个字符
       [0-9] [[:digit:]]:表示匹配0到9的任意单个数字、两种表示方法都可以
       [a-z] [[:lower:]]:表示匹配小写的a到z的任意单个字母、即a-z
       [A-Z] [[:upper:]]:表示匹配大写的A到Z的任意单个字母、即A-Z
       [[:alpha:]]:表示英文大小写字母、即:a-z,A-Z
       [[:space:]]:表示包含的空白字符、即空格键,tab键
       [[:alnum:]]:表示包含数字大小写字母、即0-9,A-Z,a-z
       [[:punct:]]:表示包含标点符号、即:" ' ? ! ; : # $...
       

字符的次数匹配:用来匹配其前面的字符的次数的

*(星号)匹配其紧挨着星号的字符出现任意次
	例:x*y就是x可以出现意次、包括0次
	
.*(点星)匹配任意长度的任意字符

\?:表示其前面的字符出现0次或者1次、\是转译字符
	例:x\?y:可以匹配到的只有xy和y
                       
\{m\}:匹配m次  如:x\{4\}y表示y前面的x出现4前就可以被匹配到
\{m,n\}:至少m次,至多n次
\{m,\}:至少m次
\{0,n\}:至多匹配n次、0不可以省略

位置锚定符:用于指定字符出现的位置

  ^:用于锚定行首,如(^Char) 匹配到的字符必须出现有行首的
  $:用于锚定行尾,如(Char$) grep 'bash$' /etc/passwd
  ^$:空白行、查找一个文件中所出现的空白行  ^hello$表示只有hello的行

单词的锚定:

\<char:锚定词首,\<[r]表示一行以r开头的单词都可以匹配、也可以使用\b表示
char\>:锚定词尾,一行以r开头的单词都可以匹配、\b
\<hello\>:表示精确锚定hello这个单词
\<h…o\>:表示以h开头、以o结尾、中间跟了任意三个字符的单词

分组元字符:

\(\):分组  \是转译字符  

例:\(ab\)*xy
	ab括起来表示一个组了,表示xy前面的ab组现出任意次,可以被匹配到的
	abxy,ababxy,ababababxy,abababababababxy,......
	

引用: 对分组的字符块进行引用

\1:后向引用,引用前面的第一个左括号以及与之对应的右括号中模式所匹配到的内容
\2:后向引用,引用前面的第二个左括号以及与之对应的右括号中模式所匹配到的内容
.......

例:\(a.b\)xy\1 可以匹配到的有(abxyab不可以匹配到)
	akbxyakb,a3bxya3b,aYbxyaYb
	
例:我们来看这个例子、找出以下love与之对应的lover、like与之对应的liker
	He like his lover.
	She love her liker.
	He love his lover.
	She like her liker.
	

4、egrep和fgrep

(1)egrep

使用扩展正则表达式来构建模式,相当于grep –E、通常写成egrep、用法基本上跟grep的相同、只是有些不需要 \ 转译。

   元字符:字符匹配
          .:匹配任意单个字符
          []:指定范围内的任意单个字符

   次数匹配:
          *:匹配其紧挨着星号的字符出现任意次
          ?:表示其前面的字符出现0次或者1次
          +:匹配其前面的字符至少1次
          {m}:匹配其前面的字符m次
          {m,n}:至少m次,至多n次
          {m,}:至少m次
          {0,n}:至多n次
          
   做位置锚定:
        ^:行首锚定
        $:行尾锚定
        \<:词首
        \>:词尾

   分组:
       ():分组
       |:或者  ab|xy意思为ab或者xy  a(b|x)y意思为aby或者axy
       

(2)fgrep

fash,它不解析正则表达式、想找什么就跟什么就可以了。

例如:

[root@localhost ~]# fgrep "/bin/bash" /etc/passwd
root:x:0:0:root:/root:/bin/bash
user1:x:1000:1001::/home/user1:/bin/bash
user2:x:1001:1002::/home/user2:/bin/bash


[root@localhost ~]# fgrep  "defaults" /etc/fstab
/dev/vda1       /       xfs     defaults                0 1
/swapfile       none    swap    defaults                0 0

5、练习:

1、显示/proc/meminfo文件中以不区分大小的s开头的行
grep -i '^s' /proc/meminfo
grep '^[sS]' /proc/meminfo

2、显示/etc/passwd中以nologin结尾的行
grep 'nologin$' /etc/passwd
取出默认shell为/sbin/nologin的用户列表
grep "nologin$' /etc/passwd | cut -d: -f1
取出默认shell为bash,且其用户ID号最小的用户的用户名
grep 'bash$' /etc/passwd | sort -n -t: -k3 | head -1 | cut -d: -f1

3、显示/etc/inittab中以#开头,且后面跟一个或多个空白字符,而后又跟了任意非空白字符的行
grep "^#[[:space:]]\{1,\}[^[:space:]]" /etc/inittab

4、显示/etc/inittab中包含了:一个数字:(即两个冒号中间一个数字)的行
grep ':[0-9]:' /etc/inittab

5、显示/boot/grub/grub.conf文件中以一个或多个空白字符开头的行
grep '^[[:space:]]\{1,\}' /boot/grub/grub.conf

6、显示/etc/inittab文件中以一个数字开头并以一个与开头数字相同的数字结尾的行
grep '^\([0-9]\).*\1$' /etc/inittab

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值