grep与正则表达式

1.什么是grep

grep(Golobal Regular Expression print)Linux系统中一个强大的文本搜索工具,也是俗称的搜索三兄弟之一,grep的最大意义就是搜索文本,把匹配的行打印到屏幕上,但不影响原文件的内容;在搜索文本的过程中,可以利用到正则表达式来定以自己的搜索匹配模式。

Unixgrep家族包括了grepegrepfgrep三个,接下来的内容也会围绕着grep来进行展开;

2.grep家族的简单用法

2.1常用用法

         grep的常用用法很简单,通常使用如下的格式:

                   grep  [OPTIONS]  PATTERN  [FILES];

         PATTERN也就是搜索模式,是grep进行文本搜索过滤的条件,通常由正常字符及正则表达式的字符组成;

         相对于grep而言,egrep = grep -E 可以使用基本的正则表达外, 还可以用扩展表达式;fgrep=grep –F, 但是fgrepgrepegrep有一些明显的区别,fgrep并不使用正则表达式,而会将PATTERN解释为一般的字符来进行查找,从而fgrep在搜索不需要使用正则表达式的情况下速度是最快的;

2.2常见参数

Options

解释

-o

只显示被模式匹配到的内容

-i

搜索时不区分字符大小写

-v

显示不能够被模式匹配到的行

-E

使用扩展的正则表达式,相当于使用egrep

-F

将范本样式视为固定字符串的列表,相当于fgrep

-c

只显示匹配行的数量

-n

在输出前加上上匹配行的行号

–color=

auto, always,   never

-A #

显示被模式匹配到的行及后#

-B #

显示被模式匹配到的行及前#

-c #

显示被模式匹配到的行及其前后各#

3.详解grep的搜索

3.1通配符

         在搞搞grep的搜索用法,也就是使用正则表达式之前,我觉得自己还是很有必要来重新过一遍Linuxshell的通配符,来作为学习正则表达式之前的热身和比较;目前最常用的文件通配符包括*?[],具体如下:

解释

示例

*

任意长度的任意字符,零个或多个;

heah*,head为首的任意长度的字符

*tail,tail为结尾的任意长度的字符

?

任意单个字符,可使用多次

y?u,?表示中间有且只亦一个字符

[]

匹配[]内任意单个字符

[0-9][abd]

[^]

不匹配[]内的任何字符

[^0-9]匹配0-9之外的任意字符

         注:这些字符都有这特殊含义,而要想使用其的一般含义,需加上转义符”\”进行转义;

3.2正则表达式

         想想还是觉得c一段正则的解释放在这里比较好,不然我自己都说不出个所以然来。正则表达式(REGular Expression);简称REGEXP,是由元字符及正常字符所书写的模式,其中有元字符不表示字符本身的意义,而是用于表达控制或通配等功能;而常用的正则表达式则分为了基础正则表达式、扩展正则表达式,为了方便自己记忆,还是觉得整个丑的表格比较下:

         偷懒这里就按照马哥教的来排个序;基础和正则表达式最大的区别也就是在使用上,例如grep –E或者egrep才可以使用扩展正则表达式,以后在使用的过程中,也必须要了解命令是否支持扩展的正则表达式先;

 

类型

元字符

意义

基础篇

扩展篇

字符匹配

.

.

匹配任意单个字符,相当于通配符?

[]

[]

匹配指定范围内的任意单个字符;

[^]

[^]

匹配指定范围外的任意单个字符;

一些常用特殊的字符匹配,通用

[0-9] = [[:digit:]] = \d = [123456789]

匹配数字

[a-z] = [[:lower:]]

匹配单个小写字母

[A-Z] = [[:upper:]]

匹配单个大写字母

[0-9a-zA-Z] = [[:alnum:]]

匹配单子字母或数字

[a-zA-Z] = [[:alpha:]]

匹配单个字母,不区分大小写

[[:space:]] = \s

匹配空白字符

[[:punct:]]

匹配单个标点符号

\w

匹配字母或数字或下划线或汉字

注:可使用[^]表示范围外,[^[]]

 

类型

元字符

意义

基础篇

扩展篇

次数匹配

(在期望匹配字符的后面提供一个控制符号,用于表达匹配前面的字符指定的次数)

*

*

匹配*前面的单个字符任意次,可以为0次;

.*

.*

匹配任意长度的任意字符;

\?

?

匹配?前面的字符0或者1次;

\+

+

匹配+前面的字符至少1次;

\{m,n\}

{m,n}

匹配其左侧的字符至少m次,至多n次;

\{m,\}

{m,}

匹配其左侧的字符至少m次,无上限;

\{0,n\}

{0,n}

匹配其左侧的字符至多n次;

\{m\}

{m}

精确匹配其左侧的字符m次;

 

类型

元字符

意义

基础篇

扩展篇

位置锚定

^

^

锚定行首,^PATTERN

$

$

锚定行尾,PATTERN$

^PATTERN$

^PATTERN$

用模式匹配整行内容;

^$

^$

^[[:space:]]$,匹配空白行;

类型

元字符

意义

基础篇

扩展篇

单词锚定

\<

\<

锚定词首,\<PATTERN =   \bPATTERN

\>

\>

锚定词尾, PATTERN\>   = PATTERN\b

\<PATTERN\>

\<PATTERN\>

匹配PATTERN能匹配到的整个单词;

\b

\b

匹配一个字边界,即字与空格间的位置;

 

类型

元字符

意义

基础篇

扩展篇

分组及引用

\(\)

()

()中字符集合到一起作为一个字符引用;

\#

\#

引用,模式中自左而右,

分组中的模式,在某次的具体匹配过程中所匹配的字符,可以被grep记忆(保存在内置的变量中,这些变量是\1, \2,…,因此,还可以被引用;

         还是要注:这些字符都有这特殊含义,而要想使用其的一般含义,需加上转义符”\”进行转义;

 

摘一段正则表达式的贪婪与非贪婪模式:

1.什么是正则表达式的贪婪与非贪婪匹配

  如:String str="abcaxc";

    Patter p="ab*c";

  贪婪匹配:正则表达式一般趋向于最大长度匹配,也就是所谓的贪婪匹配。如上面使用模式p匹配字符串str,结果就是匹配到:abcaxc(ab*c)

非贪婪匹配:就是匹配到结果就好,就少的匹配字符。如上面使用模式p匹配字符串str,结果就是匹配到:abc(ab*c)

默认是贪婪模式;在量词后面直接加上一个问号?就是非贪婪模式。

        

正则表达式还有很多,鉴于我初学的能力,慢慢来总结,记录下几个例子来帮自己回顾下:

1、找出/etc/passwd文件中的一位数或两位数:

1.png

2、找出当前系统上用户名与默认shell相同的用户:

[root@Exercises ~]# grep "^\(\<[[:alnum:]]\+\>\).*\1$" /etc/passwd

2.png

 

3、使用echo命令输出一个路径,使用grep实现basename的功能:

[root@Exercises ~]# echo "/etc/passwd/" |grep -o "[[:alnum:]]\+\/\?$" |cut -d/ -f1

passwd

4、执行ifconfig然后输出当前系统的ip

[root@Exercises ~]# ifconfig | grep -E "\<([1-9]|[1-9][0-9]|1[0-9]{2}|2[0-3][0-9])\>(\.\<([1-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\>){3}"

          inet addr:192.168.1.111  Bcast:192.168.1.255  Mask:255.255.255.0

          inet addr:192.168.88.20  Bcast:192.168.88.255  Mask:255.255.255.0

 

第一篇,很不完善,还是要继续总结,还是要坚持~

同时,求指正,求指正!谢谢~

 

原创文章,作者:AZ,如若转载,请注明出处:http://www.178linux.com/8686

(0)
AZAZ
上一篇 2015-10-07 12:02
下一篇 2015-10-08 21:40

相关推荐

  • 【Linux基础】文件管理类命令

    总结下linux系统文件管理类的命令 mkdir -> make dirtctories 创建目录 语法:mkdir [OPTION]… DIRECTORY… 常用选项-p: 自动按需创建父目录;-v: verbose,显示详细过程;-m MODE:直接给定权限;注意:路径基名方为命令的作用对象;基名之前的路径必须得存在;示例:~]# mkdir -p…

    Linux干货 2018-03-11
  • 压缩和解压缩

    今天我们所讲一些压缩以及解压缩的内容,可以方便我们去传输一些数据较大的文件,以及可以降低我们的内存使用率, 节省空间。我们常用的工具对单个文件进行压缩有4种,对于多个文件进行打包压缩有2种。 1、compress(单个文件压缩)     压缩后的文件后缀名都是.Z结尾     compress fi…

    2017-08-12
  • 11.网络解析和网络加密

    1、详细描述一次加密通讯的过程,结合图示最佳。 加密过程 1.使用单向加密算法,提取A的文件的特征码。 2.使用A的私钥对提取出来的特征码进行加密,把加密后的特征码附加在A的文件的后面。 3.使用对称加密对刚刚的A的文件和加密后的特征码进行加密,生成对称加密密钥 4.使用B的公钥对第3步骤的对称加密的密钥进行加密,加密后附加在文件的后面。 解密过程 1.使用…

    2017-09-20
  • 文本处理三剑客之一的sed

    处理文本的工具sed Stream EDitor, 行编辑器 sed是一种流编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。Se…

    Linux干货 2017-04-27
  • Linux管理目录和文件命令

     管理目录命令: pwd:显示当前目录 Cd:   改变当前目录 ls:    查看目录下的内容 rmdir: 删除目录 管理文件命令: cat: 查看文件内容 cp: 复制文件内容 grep:在文件中查找某字符 touch:创建文件 rm&nbsp…

    2016-03-05
  • Linux文件系统管理

    一、什么是文件系统     我理解的文件系统就是管理磁盘分区上数据的索引信息,其实文件系统就是一种应用程序,只不过是用来维护和管理分区上的数据而已,就跟操作系统是用来管理底层硬件一样。不同的分区可以有不同的文件系统。 二、文件系统类型     在linux系统上主要有如下类型的文件系统: &nbsp…

    Linux干货 2016-03-03