grep、egrep和正则表达式的总结

简介:

本文主要讲述grep和egrep的使用,已经在这两个命令中用到的正则表达式的一些简单的应用和事例

一、grep的使用

1.grep的解释

   grep为global search regular expression(RE) and print out the line的缩写,即根据用户指定的文本搜索模式对目标文件进行搜索并显示能够被模式匹配到的行的一种文本搜索工具。

2.grep的使用格式

   gerp [options] 'PATTERN'file,....

  其中PATTERN项需要使用''或者"",如果需要对模式进行转换,则需要使用"",如果不需要进行转换,则使用''或""都可以。模式还可以使用正则表达式来表示。

3.grep的常用选项

   --color:用来指定被模式匹配到的字符的显示颜色,参数选项有never,always和auto

   -v:反向匹配,即不能被模式所匹配到的行,也可以使用--invert-match长选项

   -o:只显示被模式匹配到字符串,而非显示整行(grep默认显示被匹配到的整行)

   -i:不区分大小写,也可以使用--ignore-case长选项

   -E:支持扩展的正则表达式,相当于egrep

   -r: 连带文件夹以下目录也查找

   -A:与数字一起使用,显示被模式匹配到的行并且显示被匹配到的行的下面多少行

   -B: 与数字一起使用,显示被模式匹配到的行并且显示被匹配到的行的上面多少行

   -C: 与数字一起使用,显示被模式匹配到的行并且显示被匹配到的行的上查找下各显示多少行

二、正则表达式的使用

1.正则表达式的解释

   正则表达式是一类字符所书写的模式,是由一些ASCII码类字符和一些元字符组成。正则表达式工作在贪婪模式下,尽可能多的去匹配字符。

   元字符不表示字符本身的意义,而是用于额外功能性的描述

2.正则表达式的分类

   正则表达式从功能上可以分为基本正则表达式和扩展正则表达式

3.基本正则表达式中元字符的使用

   1)字符匹配

      .:表示匹配任意一个字符

      案例:要求显示/etc/passwd中以s和h之间出现任意字符的

1
2
[root@localhost ~]# grep  "s.h"  /etc/passwd
sshd:x: 74 : 74 :Privilege-separated SSH:/ var /empty/sshd:/sbin/nologin

      []:匹配指定范围内的单个字符

      案例:要求显示/etc/fstab中出现c和C的行

1
2
3
4
5
6
[root@localhost ~]# grep  "[cC]"  /etc/fstab
# /etc/fstab
# Created by anaconda on Mon Feb  10  10 : 21 : 28  2014
# Accessible filesystems, by reference, are maintained under  '/dev/disk'
UUID=58894bb8-5b23-4f00-baff-0c19d450bfe9 /boot                   ext4    defaults         1  2
proc                    /proc                   proc    defaults         0  0

      [^]:匹配指定范围外的单个字符,也可使使用选项v来完成

      案例,显示/etc/passwd中没有出现#的行

1
2
3
4
5
6
7
8
9
10
[root@localhost ~]# grep -v  '#'  /etc/fstab
/dev/mapper/vg0-root    /                       ext4    defaults         1  1
UUID=58894bb8-5b23-4f00-baff-0c19d450bfe9 /boot                   ext4    defaults         1  2
/dev/mapper/vg0-usr     /usr                    ext4    defaults         1  2
/dev/mapper/vg0- var      / var                     ext4    defaults         1  2
/dev/mapper/vg0-swap    swap                    swap    defaults         0  0
tmpfs                   /dev/shm                tmpfs   defaults         0  0
devpts                  /dev/pts                devpts  gid= 5 ,mode= 620   0  0
sysfs                   /sys                    sysfs   defaults         0  0
proc                    /proc                   proc    defaults         0  0

      指定范围的字符还可以使用一些别的元素组成,如

      [[:space:]]:表示空白字符

      [[:lower:]]:表示所有小写字母

      [[:upper:]]:表示所有大写字母

      [[:aplha:]]:表示所有字母,也可使用[a-z]表示

      [[:digit:]]:表示所有的数字,也可以使用[0-9]表示

      [[:almun:]]:表示所有的数字和字母

      [[:punct:]]:表示所有特殊字符

   2)次数匹配:用来指定匹配其前面字符出现的次数,只能匹配模式紧靠着的一个字符

       *:出现任意次

      .*: 出现任意次的任意字符

      \?: 出现0次或者1次

      \{m\}: 表示出现m次

      \{m,n\}: 表示至少出现m次,至多出现n次

      \{m,\}: 表示最少出现m次

      \{0,n\}:表示至多出现n次,其中0不能省略

     案例:显示/etc/passwd中r后面出现最少一次,最多2次的

1
2
3
4
[root@localhost ~]# grep  "ro\{1,2\}"  /etc/passwd
root:x: 0 : 0 :root:/root:/bin/bash
operator:x: 11 : 0 :operator:/root:/sbin/nologin
rtkit:x: 499 : 497 :RealtimeKit:/proc:/sbin/nologin

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

       ^:用于锚定行首,用法为^Char

       $:用于锚定行尾,用法为Char$

       ^$:用来表示空白行

    案例:统计/etc/rc.d/rc.sysinit中出现的空白行

1
2
[root@localhost ~]# grep  "^$"  /etc/rc.d/rc.sysinit |wc -l
96

   4)单词的锚定:所有非自然的单词

       \<:用于锚定单词的词首,也可以使用\b表示,用法为\<Char或\bChar

       \>:用于锚定单词的行尾,也可以使用\b表示,用法为Char\>或Char\b

   案例:显示/etc/passwd中root的行

1
2
3
[root@localhost ~]# grep  "\<root\>"  /etc/passwd
root:x: 0 : 0 :root:/root:/bin/bash
operator:x: 11 : 0 :operator:/root:/sbin/nologin

   5) 分组:对模式进行分组

       \(\)  

   6) 引用:对分组的字符串基于位置引用

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

       \2: 表示引用前面的第二个左括号与之对应的右括号中的模式所匹配到的内容

       ...

      例:此处不适合于英文状态,只是做实例分析

       He like his lover

       She love her liker

       He loves his lover

       She like his liker

      要求:前面显示like的后面显示liker,前面显示love的后面显示lover

1
2
3
[root@localhost ~]# grep  "\(l..e\).*\1r"  i.txt
He loves his lover
She like his liker

4.扩展正则表达式的使用

    1)字符匹配

      .:表示匹配任意一个字符

     []:匹配指定范围内的单个字符

     [^]:匹配指定范围外的单个字符,也可使使用选项v来完成

     指定范围的字符还可以使用一些别的元素组成,如

      [[:space:]]:表示空白字符

      [[:lower:]]:表示所有小写字母

      [[:upper:]]:表示所有大写字母

      [[:aplha:]]:表示所有字母,也可使用[a-z]表示

      [[:digit:]]:表示所有的数字,也可以使用[0-9]表示

      [[:almun:]]:表示所有的数字和字母

      [[:punct:]]:表示所有特殊字符

   2)次数匹配:用来指定匹配其前面字符出现的次数,只能匹配模式紧靠着的一个字符

       *:出现任意次

      .*: 出现任意次的任意字符

      ?: 出现0次或者1次

      +: 至少出现1次

      {m}: 表示出现m次

      {m,n}: 表示至少出现m次,至多出现n次

      {m,}: 表示最少出现m次

      {0,n}:表示至多出现n次,其中0不能省略

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

       ^:用于锚定行首,用法为^Char

       $:用于锚定行尾,用法为Char$

       ^$:用来表示空白行

   4)单词的锚定:所有非自然的单词

       \<:用于锚定单词的词首,也可以使用\b表示,用法为\<Char或\bChar

       \>:用于锚定单词的行尾,也可以使用\b表示,用法为Char\>或Char\b

   5) 分组:对模式进行分组

       \(\)

   6) 引用:对分组的字符串基于位置引用

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

       \2: 表示引用前面的第二个左括号与之对应的右括号中的模式所匹配到的内容

三、egrep的使用

   egrep相当于grep -E,使用扩展正则表达式来构建模式,此处不再累赘

   由于本人水平有限,如出现错误,请大家多多指正

练习:

1、显示/proc/meminfo文件中以大小写s开头的行;

# grep "^[sS]" /proc/meminfo

# grep -i "^s" /proc/meminfo

2、取出默认shell为非bash的用户;

# grep -v "bash$" /etc/passwd | cut -d: -f1

3、取出默认shell为bash的且其ID号最大的用户;

# grep "bash$" /etc/passwd | sort -n -t: -k3 | tail -1 | cut -d: -f1

4、显示/etc/rc.d/rc.sysinit文件中,以#开头,后面跟至少一个空白字符,而后又有至少一个非空白字符的行;

# grep "^#[[:space:]]\{1,\}[^[:space:]]\{1,\}" /etc/rc.d/rc.sysinit

5、显示/boot/grub/grub.conf中以至少一个空白字符开头的行;

# grep "^[[:space:]]\{1,\}[^[:space:]]\{1,\}" /boot/grub/grub.conf

6、找出/etc/passwd文件中一位数或两位数;

# grep --color=auto "\<[0-9]\{1,2\}\>" /etc/passwd

7、查看当前系统上root用户的所有信息;

# grep "^root\>" /etc/passwd

8、添加用户bash和testbash、basher,而后找出当前系统上其用户名和默认shell相同的用户;

# grep --color=auto "^\([[:alnum:]]\{1,\}\)\>.*\1$" /etc/passwd


本文转自wangfeng7399 51CTO博客,原文链接:http://blog.51cto.com/wangfeng7399/1360804,如需转载请自行联系原作者

相关文章
|
5月前
|
监控 Unix Linux
强大的文本处理工具组合:egrep、正则表达式、awk、cut、xargs
了解Linux和Unix文本处理的关键工具:egrep(扩展正则表达式搜索)、正则表达式、awk(文本分析)、cut(剪切文本)和xargs(传递参数给命令)。这些工具组合使用可高效处理、分析大量数据,尤其在日志分析和文本查询中。例如,从Web服务器日志中查找404错误,先用egrep筛选,再用awk或cut提取IP和URL,最后用xargs配合其他命令执行操作。掌握这些工具能提升工作效率。
|
6月前
|
机器学习/深度学习 Shell 开发工具
正则表达式 与文本三剑客(sed grep awk)
正则表达式 与文本三剑客(sed grep awk)
|
6月前
|
运维 Unix Linux
grep正则表达式搜索
grep正则表达式搜索
52 3
|
6月前
|
存储 算法 Shell
【Shell 命令集合 文档编辑】Linux 正则表达式匹配 egrep命令使用教程
【Shell 命令集合 文档编辑】Linux 正则表达式匹配 egrep命令使用教程
77 0
|
Unix Linux
如何在 Linux 中使用 Grep 和正则表达式进行文本搜索?
如何在 Linux 中使用 Grep 和正则表达式进行文本搜索?
328 5
|
Linux Perl
[笔记]linux grep之正则表达式
[笔记]linux grep之正则表达式
|
机器学习/深度学习 NoSQL Linux
Linux行处理工具: grep 正则表达式
Linux行处理工具: grep 正则表达式
113 0
|
机器学习/深度学习 C语言 数据安全/隐私保护
『正则表达式』概念 及在grep、awk、sed、C语言、Python中的简单应用
正则表达式,又称规则表达式,(Regular Expression,在代码中常简写为regex、regexp或RE),是一种文本模式。它可以用来检查一个字符串是否符合某个规则,或者从一个字符串中提取出符合某个规则的子串。正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本。 正则表达式是由普通字符(例如字符 a 到 z)以及特殊字符(称为"元字符")组成的文字模式。模式描述在搜索文本时要匹配的一个或多个字符串。
|
机器学习/深度学习 移动开发 Go
正则表达式使用说明(包含find命令与grep命令)
正则表达式使用说明(包含find命令与grep命令)
158 0
|
自然语言处理 Shell Perl
Shell正则表达式(grep)
Shell正则表达式(grep)
69 0