在此之前介绍过通配符,我们可以通过使用通配符来匹配文件来达到搜索想要查找文件的目的,那如果要查找文件的内容又该如何搜索及匹配查找呢?

那么我们可以使用grep命令来完成对文件内容的匹配并将它显示出来,那么接下来主要介绍一下grep命令的使用。

grep的作用:根据模式搜索文本,并将符合模式的行显示出来。

语法格式 grep [option] PATTERN FILE..

-i:匹配时忽略大小写

--color:把匹配的字符串用颜色高亮显示出来

-v:匹配的行不显示,不匹配行的显示

-o:只显示被模式匹配的字符串

-n:显示匹配行的行号

-E:支持扩展的正则表达式(后面的元字符那必须是扩展正则表达式的元字符)

grep -E=egrep

-A n:after 当某行被模式匹配成功时,显示该行以及该行后面的n行

-B n:before 某行被模式匹配成功时,显示该行以及该行前面的n行

-C n:-A和-B的结合体,显示前后n行


那么什么是模式呢?

模式:就是由文本字符和正则表达式的元字符组合而成的匹配条件

正则表达式的元字符,可以分为这几类:

1、字符匹配

.:表示任意单个字符

[]:指定范围内的任意单个字符

[^]:指定范围外的任意单个字符


2、匹配次数(linux的哲学思想就是贪婪匹配,通俗的说就是尽可能的去匹配)

*:匹配其前面的字符任意次,包括0次

.*:表示任意长度的任意字符

\?(转义):匹配其前面的字符0次或1次

\{m,n\}(转义):匹配其前面的字符至少m次,至多n次

wKiom1OXBuajgWc9AADd5fqAmt0276.jpg


3、位置锚定

^:锚定行首,该符号后面的任意字符必须在行首(如果某行前面有空格,这样的行将不会匹配

$:行尾锚定,该符号前面的任意字符必须在行尾

^$:表示空白行


4、单词锚定

\<或\b:锚定词首,其后面的任意字符必须作为单词的词首出现(说明:特殊字符不是单词的组成部分

\>或\b:锚定词尾,其前面的任意字符必须作为单词的词尾出现

wKiom1OXBXKwr5nIAAEDthIuv8E816.jpg



5、分组

\(\):把字符串当做一个组,再来匹配

例如 \(ab\)*:表示将ab当做一个整体进行匹配,匹配这个整体的任意次数

分组的另一个语法:向后引用

向后引用:就是引用前面括号里面的内容,并且前面括号里面的内容和后面的引用的内容一样。

\1,\2,\3...:表示引用第一个左括号以及与之对应的右括号里面的内容,且保持一致

wKiom1OXA-GRBoPuAAGN7D3_IEc365.jpg


我们知道正则表达式分为基本正则表达式和扩展正则表达式

基本正则表达式在上面已经介绍了,扩展正则表达式只是在基本正则表达式上进行了部分修改和增加了部分命令。那么我们先来看看正则表达式的元字符。同样也可以分为以下几类:

1、字符匹配(这个和基本正则表达式一样)

.:匹配任意单个字符

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

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

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


2、次数匹配

*:匹配其前面的字符任意次

?:在扩展正则表达式里面不加\来转义,表示匹配其前的字符0次和1次

{m,n}:在扩展正则表达式里面不加\来转义,匹配其前的字符至少m次,至多n次

+:表示匹配其前字符至少一次,相当于{1,}


3、位置锚定(和基本正则表达式相同)

^:行首锚定,该字符后面的任意字符必须出现在行首

$:行尾锚定,该字符前面的任意字符必须出现在行尾

wKiom1OXDajjMn4aAAFMj5Zl7lU331.jpg

4、单词锚定

\<或\b:词首锚定,其后面的字符必须出现在词首

\>或\b:词尾锚定,其前面的字符必须出现在词尾


5、分组

():在扩展正则表达式里面不加\来转义,将括号里面的字符串当做一个整体来显示

\1,\3...:引用第一(二,三...)个左括号以及与之对应的右括号里面的内容,且两者一致


6、或者

|:表示或者的关系,只选其一

例如 ab|cd:表示ab或者cd

示例一:使用正则表达式来匹配所有的ip地址。

我们知道ip地址是由4个单词和3个'.'组成的,每一个单词最少由一位数字组成,最多由三位数字组成。

最大的ip为255.255.255.255

对于ip地址分析如下:

1、当单词由一位数字组成时,正则表达式为[0-9]

2、当单词由两位数字组成时,正则表达式为[1-9][0-9]

3、当单词由三位数字组成时,由于要么是1开头的,要么是2开头的,因此又可以分为如下情况:

当第一位数字为1时,正则表达式为1[0-9][0-9]

当第一位数字为2时,由于2开头的最大为255,因此又可以将第二位数分成非5和为5的情况

当第二个数字非5时,正则表达式为2[0-4][0-9]

当第二个数字是5时,正则表达式为25[0-5]

因此,匹配所有的ip地址,其中包括0.0.0.0 255.255.255.255

则使用的命令为:

grep -E '(\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>\.){3}\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>' FILE

wKioL1PWNGTQZiuvAAFac9YjzDM818.jpg


示例二、使用正则表达式匹配A、B、C类地址

egrep --color '\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[01][0-9]|22[0-3])\>\.(\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>\.){2}\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>' FILE

wKiom1PWN3LAJEGUAADP-pHdivM785.jpg

grep,egrep使用以及正则表达式的使用的更多相关文章

  1. Html5 canvas实现粒子时钟的示例代码

    这篇文章主要介绍了Html5 canvas实现粒子时钟的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  2. HTML5数字输入仅接受整数的实现代码

    这篇文章主要介绍了HTML5数字输入仅接受整数的实现代码,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  3. ios – 使用大写符号在字符串swift中获取URL的正则表达式

    我尝试在文本中获取URL.所以,在此之前,我使用了这样一个表达式:但是当用户输入带有大写符号的URL时(例如Http://Google.com,它与它不匹配)我遇到了问题.我试过了:但什么都没发生.解决方法您可以使用正则表达式中的i内联标志关闭区分大小写,有关可用正则表达式功能的详细信息,请参阅FoundationFrameworkReference.(?ismwx-ismwx)Flagsetti

  4. 在Xcode4中,你可以更改用于显示隐形字符的字符吗?

    我更喜欢VisualStudio显示隐形的方式……

  5. ios – NSURLErrorDomain代码-1002下载pdf

    我正在尝试缓存一个网页,然后我可以使用UIWebView显示该网页.我在另一个NSURLSessionDataTask的完成块内的for循环(尝试缓存6个网页)中有相关的NSURLSessionDataTask.当我跑步时,我不断收到此错误:Ayy下载错误,数据:响应:(空)错误:错误域=NSURLErrorDomain代码=-1002“操作无法完成.(NSURLErrorDomain错误-1

  6. ios – 应用程序商店描述特殊字符

    是不是可以在AppStore描述中使用像星星这样的特殊字符了?我得到这个错误:描述不得包含标记语言.说明不得包含以下字符:★提前致谢:)解决方法仍然允许一些unicode字符.以下字符已经过测试并仍然有效:◆√至于现在他们工作正常,但苹果可以随时再次改变条件.

  7. ios – 将数组中的字符转换为整数

    即使我搜索了文档,我似乎无法弄清楚如何做到这一点.我试图弄清楚如何将数组中索引处的字符转换为整数.例如,假设我有一个名为“容器”的字符数组,我无法弄清楚该怎么做:谢谢您的帮助!解决方法Swift并不容易在原始和类型表示之间进行转换.这是一个在此期间应该有所帮助的扩展:这使您可以非常接近您想要的:对于遇到此问题的任何工程师,请参阅rdar://17494834

  8. ios – 如何在Swift 3中使用正则表达式?

    解决方法我相信.当没有其他选项适用时,将使用.allZeros.因此,使用Swift3,您可以传递一个空的选项列表或省略options参数,因为它默认为无选项:要么请注意,在Swift3中,您不再使用error参数.它现在抛出.

  9. ios – lldb断点在类目标c中的所有方法

    如何使用lldb在ObjectiveC类中的所有方法上自动设置断点?

  10. ios – 创建一个包含n个空格或其他重复字符的字符串

    我想使用Swift使用n个空格进行字符串,但不使用for循环或手动如下所示:解决方法String已经有一个repeating:count:initializer就像Array(和其他采用RangeReplaceableIndexable协议的集合):所以你可以打电话:请注意,重复的参数是一个字符串,而不仅仅是一个字符,因此您可以重复整个序列:编辑:更改为Swift3语法,并删除了关于Swift1类

随机推荐

  1. 法国电话号码的正则表达式

    我正在尝试实施一个正则表达式,允许我检查一个号码是否是一个有效的法国电话号码.一定是这样的:要么:这是我实施的但是错了……

  2. 正则表达式 – perl分裂奇怪的行为

    PSperl是5.18.0问题是量词*允许零空间,你必须使用,这意味着1或更多.请注意,F和O之间的空间正好为零.

  3. 正则表达式 – 正则表达式大于和小于

    我想匹配以下任何一个字符:或=或=.这个似乎不起作用:[/]试试这个:它匹配可选地后跟=,或者只是=自身.

  4. 如何使用正则表达式用空格替换字符之间的短划线

    我想用正则表达式替换出现在带空格的字母之间的短划线.例如,用abcd替换ab-cd以下匹配字符–字符序列,但也替换字符[即ab-cd导致d,而不是abcd,因为我希望]我如何适应以上只能取代–部分?

  5. 正则表达式 – /bb | [^ b] {2} /它是如何工作的?

    有人可以解释一下吗?我在t-shirt上看到了这个:它似乎在说:“成为或不成为”怎么样?我好像没找到’e’?

  6. 正则表达式 – 在Scala中验证电子邮件一行

    在我的代码中添加简单的电子邮件验证,我创建了以下函数:这将传递像bob@testmymail.com这样的电子邮件和bobtestmymail.com之类的失败邮件,但是带有空格字符的邮件会漏掉,就像bob@testmymail也会返回true.我可能在这里很傻……当我测试你的正则表达式并且它正在捕捉简单的电子邮件时,我检查了你的代码并看到你正在使用findFirstIn.我相信这是你的问题.findFirstIn将跳转所有空格,直到它匹配字符串中任何位置的某个序列.我相信在你的情况下,最好使用unapp

  7. 正则表达式对小字符串的暴力

    在测试小字符串时,使用正则表达式会带来性能上的好处,还是会强制它们更快?不会通过检查给定字符串的字符是否在指定范围内比使用正则表达式更快来强制它们吗?

  8. 正则表达式 – 为什么`stoutest`不是有效的正则表达式?

    isthedelimiter,thenthematch-only-onceruleof?PATTERN?

  9. 正则表达式 – 替换..与.在R

    我怎样才能替换..我尝试过类似的东西:但它并不像我希望的那样有效.尝试添加fixed=T.

  10. 正则表达式 – 如何在字符串中的特定位置添加字符?

    我正在使用记事本,并希望使用正则表达式替换在字符串中的特定位置插入一个字符.例如,在每行的第6位插入一个逗号是什么意思?如果要在第六个字符后添加字符,请使用搜索和更换从技术上讲,这将用MatchGroup1替换每行的前6个字符,后跟逗号.

返回
顶部