grep 命令与正则表达的协同使用

UpDate 2018-10-22

Author unnam3d

Mail indv.zhang@foxmail.com

Tip Please feel free to contact me via mail above for any confusion or suggestions

grep, egrep, fgrep - print lines matching a pattern

grep(Global Research)亦即根据某一个模式(过滤规则)去全局性的搜索文本,并将符合模式的文本行显示出来。grep其本身的意义是做部分匹配,也就是说,当你使用grep进行搜索的时候,只要某一行的内容里部分匹配,grep就会将结果显示出来。而这里的模式(Pattern)是指,文本字符和正则表达式的元字符组合而成的匹配条件。简而言之,grep就是使用基本正则表达式定义的模式来过滤文本的命令。

notice:grep 默认工作在贪婪模式下,也就是在匹配的过程中,会尽可能长的匹配,能匹配到哪就匹配到哪。

usage: grep [options] PATTERN [FILE...]

  • option

    -i, --ignore-case:忽略模式和输入文件中的大小写

    --colour, --color:将匹配到的内容彩色输出

    -v:反向查找,显示没有被模式匹配到的行

    -o:只显示被模式匹配到的字符串,每个字符串显示为一行

    -E:使用扩展正则表达式

    -A #:这其中的#表示一个数字,当使用grep匹配到字符串后,不仅显示匹配到的行,还显示该行后面#个行的内容,可以理解为after

    -B #:同-A意义相同,不同的是,显示的是匹配到的行前面#个行的内容,可以理解为before

    -C #:显示的是匹配到的行前后#个行的内容,可以理解为context

## option的例子
## *first* 表示 first是有颜色的
## grep -E = egrep 这里不做举例
## fgrep可以快速搜索,但不支持正则表达式,模式中的字符会被当做字符本身去匹配。

$ cat >> test.txt << EOF
> This is the first line
> This is the second line
> This is the third line
> EOF
$ grep -iv 'First' test.txt
This is the second line
This is the third line
$ grep --color 'first' test.txt
This is the *first* line
$ grep -io 'First' test.txt
first
$ grep -A1 'second' test.txt
This is the second line
This is the third line
$ grep -B1 'second' test.txt
This is the first line
This is the second line
$ grep -C1 'second' test.txt
This is the first line
This is the second line
This is the third line

正则表达式(REGgular EXPression, REGEXP)

正则表达式分为基本正则表达式(Basic REGEXP)扩展正则表达式(Extended REGEXP)

无论是哪一种,正则表达式都含义几个特性:

  • 元字符
  • 位置锚定
  • 分组

元字符

正则表达式里都有一些元字符,这些元字符不表示其本身的意义,而是在正则表达式中有其特定的意义。我在bash特性简单梳理一文中提及过文件名通配(globbing)。

在文件名通配中,这些元字符的特定意义如下:

  1. '*' : 匹配任意长度的任意字符
  2. '?' : 匹配任意单个字符
  3. '[]' : 匹配指定范围内的任意单个字符
  4. '[^]' : 匹配指定范围外的任意单个字符

而在正则表达式中,元字符的特定意义为:

  1. '.': 表示任意单个字符
  2. '[]': 匹配指定范围内的任意单个字符
  3. '[^]': 匹配指定范围外的任意单个字符
  4. '*': 表示匹配其前面的字符任意次
  5. '.*': 表示任意长度的任意字符
  6. '?': 表示匹配其前面的字符1次或0次
  7. '\{m, n\}': 表示匹配其前面的字符至少m次,至多n次

除了这些特定的元字符的意义外,正如文件通配符中所描述的字符集合,正则表达式同样支持字符集合:

  1. [:space:] 表示空白字符
  2. [:punct:] 表示标点符号
  3. [:lower:] 表示小写字母
  4. [:upper:] 表示大写字母
  5. [:alpha:] 表示大小写字母
  6. [:digit:] 表示数字
  7. [:alnum:] 表示数字和大小写字母
元字符示例
# 示例解析

$ grep 'a.b' test.txt
它只能匹配a与b之间存在一个字符的字符串,而之间存在的字符串是什么是任意的。因此输出结果只有 aab, acb, adb

$ grep 'a*b' test.txt
它匹配的是以b结尾,b前面具有任意个a的字符串,任意个包括零个,因此它只匹配到了 b, ab, aab 而 acb adb amnbamnbamnb 也之所以显示出来,是因为grep的本身意义做的是部分匹配,只要改行有匹配到的内容就把该行显示出来。

$ grep 'a.*b' test.txt
它匹配的是以a开头,b结尾,中间可以存在任意个字符,且可以是任意字符。因此它就把a开头b结尾的所以字符都显示了出来,ab, aab, acb, adb, amnbamnbamnb

$ grep 'a\?' test.txt
它匹配包含一次a或者0次a的字符串,所以只要有a,就可以被检测出来,结果就如上了。

$ grep 'a\{1,\}b' test.txt
它匹配b前面最少有一次a的字符串,也就是ab, aab, aaab等等,所以结果如上。

$ grep 'a\{0,3\}' test.txt
它匹配包含最多三个a,所以结果如上。

位置锚定

位置锚定,就是在进行搜索的时候,所搜索的字符必须出现在特定的位置。

  1. '^': 锚定行首,此字符后面的任意字符串内容必须出现在行首。

  2. '$': 锚定行尾,此字符前面的任意字符串内容必须出现在行尾。

  3. '^$': 锚定空白行,也就是搜索文件中的空白行。

  4. '\<'或'\b': 锚定单词首部,此字符后面的任意字符串必须出现在单词首部。

  5. '\>'或'\b': 锚定单词尾部,此字符后面的任意字符串必须出现在单词尾部。

    notice: 这里单词的含义并不特指英文的单词,它只要以一个字符开始,以一个字符结束,中间只要没有出现特殊字符,它这个字符串整体就叫做单词,而这特殊字符包括: . :

位置锚定示例
# 示例解析

$ grep '^r..t' test.txt
它将匹配到r..t的字符串,并且还是位于行首的行显示出来。

$ grep 'r..t$' test.txt
它将匹配到r..t的字符串,并且还是位于行尾的行显示出来。

$ grep '^$' test.txt
它将空白行显示出来

$ grep 'fork\>' test.txt
它将匹配到的字符fork,并且还是位于单词尾部的行显示了出来。

$ grep '\<ar' test.txt
它将匹配到的字符ar, 并且还是位于单词首部的行显示了出来。

$ grep '\<useful\>' test.txt
它将匹配到的字符useful, 并且是整个单词的行显示了出来。

分组

分组的意义,通俗的来讲,就是将一捆字符作为一个整体来看待,用\(\)来表示。

例如:\(ab\)* 将ab作为一个整体,星号修饰的ab这一个整体。而ab*仅仅修饰b一个字符

$ grep '\(ab\)*' test.txt

上面这个命令就表示在文件test.txt中匹配ab这一整体,它可以匹配到ab, abab, ababab这样。

后向引用

与分组搭配使用的还有后向引用

\1: 引用第一个左括号以及与之对应的右括号所包括的所有内容

$ grep '\([0-9]\).*\1$' /etc/inittab

\2: 引用第二个左括号以及与之对应的右括号所包括的所有内容

\3: 引用第三个左括号以及与之对应的右括号所包括的所有内容

<练习>

以单个空格加单个数字结尾的行

$ grep '[[:space:]][[:digit:]]$' /etc/inittab

扩展正则表达式

扩展正则表达式与正则表达式在很多地方的意义都是相同的。例如:

  • 字符匹配:. [] [^]

    次数匹配:* ? {m,n}

  • 位置锚定;

  • 分组;

NOTICE:

  1. 次数匹配中的?和{m,n}不需要加反斜线 \
  2. 分组也不需要加反斜线,而且这里的分组才真正意义上实现了分组的意义。也支持\1, \2, \3的引用。

除了与正则表达式相同意义的地方,扩展表达式也有其独特的地方:

  • 次数匹配中 + 加号代表基本正则表达式中的 \{1,\},所以加号代表匹配其前面的字符至少一次

  • 支持逻辑或:a|b = a 或 b

    C|cat: C或cat $ grep --color -E 'C|cat' test.txt

    (C|c)at: Cat或cat $ grep --color -E '(C|c)at' test6.txt

  • grep -E = egrep

    egrep --color '\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>' /boot/grub/grub.conf

练习

  1. 找出ifconfig命令中0-255之间的数字
  2. 找出ifconfig命令中形如x.x.x.x格式的数字格式
  3. 找出ifconfig命令中的ip地址

答案

  1. ifconfig | egrep --color '\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>'

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

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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,132评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,802评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,566评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,858评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,867评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,695评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,064评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,705评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,915评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,677评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,796评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,432评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,041评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,992评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,223评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,185评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,535评论 2 343

推荐阅读更多精彩内容