九分钟教你轻便驾驭 grep 命令中的正则表明式

在 Linux 、类 Unix 系统中我该如何使用 Grep 命令的正则表达式呢,而且 GNU grep 在所有的 Linux 系统中都是默认有的,如何在 Linux 系统和类 Unix 的操作系统中使用带正则表达式的 grep 命令呢,Linux 系统自带了支持拓展正则表达式的 GNU 版本 grep 工具

图片 3

点字符转义

下边要合作到 IP 地址为 192.168.1.254 的正则式是不得法的:(LCTT
译注:能够宽容到该 IP 地址,但是也许有望非常到间隔符号不是点的近似格式)

grep '192.168.1.254' /etc/hosts

八个点字符都须要转义:

grep '192/.168/.1/.254' /etc/hosts

下边包车型地铁事例只好协作出 IP 地址:(LCTT 译注:实际上由于 IP
地址中数字的取值范围,该正则表明式并不规范)

egrep '[[:digit:]]{1,3}/.[[:digit:]]{1,3}/.[[:digit:]]{1,3}/.[[:digit:]]{1,3}' 文件名

你能够合营两位数(举个例子相称 foo11 , foo12 ):
grep ‘foo[0-9][0-9]’ FILENAME

在 Linux 、类 Unix 系统中自己该怎么样行使 Grep 命令的正则表明式呢?

什么在 Linux 系统和类 Unix 的操作系统中运用带正则表达式的 grep 命令呢?

grep 正则表达式示例

在 /etc/passswd 目录中找找 ‘vivek’

grep vivek /etc/passwd

输出例子:

vivek:x:1000:1000:Vivek Gite,,,:/home/vivek:/bin/bash
vivekgite:x:1001:1001::/home/vivekgite:/bin/sh
gitevivek:x:1002:1002::/home/gitevivek:/bin/sh

寻觅大小写大肆的 vivek(即不区分抑扬顿挫写的寻觅卡塔尔

grep -i -w vivek /etc/passwd

研究大小写任意的 vivek 或 raj

grep -E -i -w 'vivek|raj' /etc/passwd

下面最后的事例展现的,正是一个恢弘的正则表明式的形式。

不光是数字,你能够包容字母:
grep ‘[A-Za-z]’ FILENAME

怎么接受 grep 的“或”相配?

选取如下的语法:

grep -E 'word1|word2' 文件名
或
egrep 'word1|word2' 文件名

或者是

grep 'word1/|word2' 文件名

您能够用 “.” 来顶替单个字符。在上边的例证中,查询了颇负以字母 “b”
最初、字母 “t” 结尾的八个字符的单词。
grep ‘\<b.t\>’ FILENAME

正则表明式

正则表明式就是用来匹配每行输入的一种格局,格局是指一串字符系列。下边是表率:

^w1
w1|w2
[^ ]

正则表明式只然而是各种输入行相称的方式。形式是叁个字符种类。上面都以楷模:

字符类

匹配 Vivek 或 vivek:

grep '[vV]ivek' 文件名

或者

grep '[vV][iI][Vv][Ee][kK]' 文件名

也能够相称数字 (即相配 vivek1 或 Vivek2 等等卡塔尔(قطر‎:

grep -w '[vV]ivek[0-9]' 文件名

能够合营七个数字字符(即 foo11、foo12 等卡塔尔:

grep 'foo[0-9][0-9]' 文件名

不仅局限于数字,也能合作起码三个字母的:

grep '[A-Za-z]' 文件名

来得含有 “w” 或 “n” 字符的全数行:

grep [wn] 文件名

位居括号内的表明式,即包在 “[:” 和 “:]”
之间的字符类的名字,它象征的是归属此类的装有字符列表。标准的字符类名称如下:

  • [:alnum:] – 字母数字字符
  • [:alpha:] – 字母字符
  • [:blank:] – 空字符: 空格键符 和 制表符
  • [:digit:] – 数字: ’0 1 2 3 4 5 6 7 8 9′
  • [:lower:] – 小写字母: ‘a b c d e f g h i j k l m n o p q r s t u v
    w x y z’
  • [:space:] – 空格字符:
    制表符、换行符、垂直制表符、换页符、回车符和空格键符
  • [:upper:] – 大写字母: ‘A B C D E F G H I J K L M N O P Q ENVISION S T U V
    W X Y Z’

在此个事例所示的是同盟全体大写字母:

grep '[:upper:]' 文件名
参谋文献:
  • grep and regex 的拔刀相助文书档案
  • grep 的 info扶植文书档案

grep使用简明及正则表明式
http://www.linuxidc.com/Linux/2013-08/88534.htm

正则表明式的用法
http://www.linuxidc.com/Linux/2013-03/81897.htm

正则表明式之零宽断言
http://www.linuxidc.com/Linux/2013-03/81897.htm

Linux命令-文件文本操作grep 
http://www.linuxidc.com/Linux/2015-12/126259.htm

grep正则表明式
http://www.linuxidc.com/Linux/2015-09/123035.htm

Linux中正则表达式与公事格式化管理命令(awk/grep/sedState of Qatar
http://www.linuxidc.com/Linux/2013-03/81018.htm

初稿链接:
正文链接:http://www.linuxstory.org/grep-regular-expressions/

正文永世更新链接地址:http://www.linuxidc.com/Linux/2016-01/127464.htm

图片 1

grep 和 egrep

egrep 等同于 grep -E
。它会以扩充的正则表明式的情势来分解形式。上边来自 grep 的支持页:

中央的正则表明式元字符 ?、+、 {、 |、 ( 和 State of Qatar已经失却了它们原本的意思,要选拔的话用反斜线的版本 /?、/+、/{、/|、/(
和 /卡塔尔(قطر‎ 来代替。 守旧的 egrep 并不援助 { 元字符,一些 egrep 的完结是以
/{ 代替的,所以一个可移植的台本应该防止在 grep -E 使用 {
符号,要相称字面包车型大巴 { 应该选拔 [}]。

GNU grep -E 试图支持守旧的用法,固然 {
出在在无效的间隔标准字符串那前,它就能假定 { 不是特殊字符。

诸如,grep -E ‘{1′ 命令寻找包罗 {1
多少个字符的串,而不会报出正则表明式语法错误。

POSIX.2 标准允许这种操作的扩展,但在可移植脚本文件里应该制止那样使用。

参考:

  • grep 和 regex 补帮手册页(7卡塔尔国
  • grep 的 info 页

协作包蕴几个字母 v 的字符串结果:
egrep “v{2}” FILENAME

怎么着寻找以“-” 符号开始的相配形式?

要利用 -e 选项来找寻相称 ‘–test–’ 字符串,假如不利用 -e 选项,grep
命令会构思把 ‘–test–’ 当做本人的选项参数来分析:

grep -e '--test--' 文件名

以下将不分大小写地同盟单词 Linux 或 Unix :
egrep -i ‘^(linux|unix)’ FILENAME

什么使 grep 命令高亮展现?

动用如下的语法:

grep --color 正则表达式 文件名

图片 2

怎么接收 grep 的“和”匹配?

运用上边包车型客车语法来展示既满含 ‘word1′ 又含有 ‘word2′ 的装有行

grep 'word1' 文件名 | grep 'word2'

三、正则表明式操作符总括

正则表明式节制符

限定符 描述
. 匹配任意的一个字符。
? 匹配前面的子表达式,最多一次。
* 匹配前面的子表达式零次或多次。
+ 匹配前面的子表达式一次或多次。
{N} 匹配前面的子表达式 N 次。
{N,} 匹配前面的子表达式 N 次到多次。
{N,M} 匹配前面的子表达式 N 到 M 次,至少 N 次至多 M 次。
只要不是在序列开始、结尾或者序列的结束点上,表示序列范围。
^ 匹配一行开始的空字符串;也表示字符不在要匹配的列表中。
$ 匹配一行末尾的空字符串。
/b 匹配一个单词前后的空字符串。
/B 匹配一个单词中间的空字符串。
/< 匹配单词前面的空字符串。
/> 匹配单词后面的空字符串。

1、怎么着寻觅一个兼有以 ‘-‘ 起头的的情势?

Linux 附带有 GNU grep 命令工具,它支持扩张正则表明式(extended regular
expressions),而且 GNU grep 在具备的 Linux 系统中都以私下认可有的。Grep
命令被用于寻觅一定存款和储蓄在您服务器或职业站上的任何新闻。

还是能够这么:
grep ‘foo.*bar\|word3.*word4’ FILENAME

怎么仅仅只展现相配出的字符,并不是特别出的行?

行使如下语法:

grep -o 正则表达式 文件名

四、关于 grep 和 egrep

egrep 即 grep -E ,它把方式作为三个扩展的正则表明式解释。grep
帮忙文书档案中那样定义:

 In basic regular expressions the meta-characters ?, +, {, |, (, and ) lose their special meaning; instead use the backslashed versions \?, \+, \{,
       \|, \(, and \).
       Traditional egrep did not support the { meta-character, and some egrep implementations support \{ instead, so portable scripts should avoid  {  in
       grep -E patterns and should use [{] to match a literal {.
       GNU grep -E attempts to support traditional usage by assuming that { is not special if it would be the start of an invalid interval specification.
       For example, the command grep -E '{1' searches for the two-character string {1 instead of reporting a syntax  error  in  the  regular  expression.
       POSIX.2 allows this behavior as an extension, but portable scripts should avoid it.

何以使用种类车检查测?

应用如下的语法,您能够质量评定三个字符在种类中再度现身次数:

{N}
{N,}
{min,max}

要相称字符 “v” 现身几遍:

egrep "v{2}" 文件名

下边包车型地铁授命能相配到 “col” 和 “cool” :

egrep 'co{1,2}l' 文件名

下边的指令将会匹配出至稀少八个 ‘c’ 字符的持有行。

egrep 'c{3,}' 文件名

上边包车型大巴例证会相称 91-1234567890(即一个数字-十二个数字) 这种格式的手提式无线电话机号。

grep "[[:digit:]]/{2/}[ -]/?[[:digit:]]/{10/}" 文件名

在上头的例子中,
◾\< 在单词的发端地方相称空格字符串
◾\> 在单词的结尾相配空格字符串

锚点

你能够分别使用 ^ 和 $
符号来正则相称输入行的开端或最终。上面包车型地铁例证寻找显示唯有以 vivek
开头的输入行:

grep ^vivek /etc/passwd

出口例子:

vivek:x:1000:1000:Vivek Gite,,,:/home/vivek:/bin/bash
vivekgite:x:1001:1001::/home/vivekgite:/bin/sh

您能够独自只找寻出以单词 vivek 以前的行,即不突显 vivekgit、vivekg
等(LCTT 译注:即该单词前面是空格、符号等日文的单词分隔符。)

grep -w ^vivek /etc/passwd

寻觅以单词 word 结尾的行:

grep 'foo$' 文件名

相称仅仅只包蕴 foo 的行:

grep '^foo$' 文件名

日常来讲所示的例证能够寻觅空行:

grep '^$' 文件名

使用上边例子的语法:
grep –color regex FILENAME

图片 3

个中四个点都亟待被转义:
grep ‘192\.168\.1\.254’ /etc/hosts

通配符

您能够使用 “.” 来相称单个字符。例子中非凡以 “b” 早先以 “t”
结尾的3个字符的单词:

grep '/<b.t/>' 文件名

在这儿,

  • /< 相称单词后边的空字符串
  • /> 相称单词前边的空字符串

打字与印刷出唯有四个字符的全部行:

grep '^..$' 文件名

来得以三个点和叁个数字最初的行:

grep '^/.[0-9]' 文件名

您还足以用下边那样的措施找出空白行:
grep ‘^$’ FILENAME

还可以够那样:
grep ‘[vV][iI][Vv][Ee][kK]’ FILENAME

根据下边包车型地铁语法彰显全部富含了单词 ‘word1′ 和 ‘word2′ 的结果:
grep ‘word1’ FILENAME | grep ‘word2’

输出结果案例:
vivek:x:1000:1000:Vivek Gite,,,:/home/vivek:/bin/bash
vivekgite:x:1001:1001::/home/vivekgite:/bin/sh
gitevivek:x:1002:1002::/home/gitevivek:/bin/sh

检索以 ‘foo’ 结尾的文本格式:
grep ‘foo$’ FILENAME

下边包车型地铁身教重于言教将相配 “91-1234567890″ 格式的手提式无线电话机号码(即
“两位数字-10个人数字”)
grep “[[:digit:]]\{2\}[ -]\?[[:digit:]]\{10\}” FILENAME

2、怎样在grep中接纳 O路虎极光 的逻辑运算 ?
grep -E ‘word1|word2’ FILENAME
### OR ###
egrep ‘word1|word2’ FILENAME

6、怎样使 grep 的出口只体现匹配的部分并不是整行?

在终极二个例子中,使用了扩张正则表明式的形式。

展现全数包含 “w” 或 “n” 字母的文本行:
grep [wn] FILENAME

以下示例将只相当二个地址:
egrep
‘[[:digit:]]{1,3}\.[[:digit:]]{1,3}\.[[:digit:]]{1,3}\.[[:digit:]]{1,3}’
FILENAME

下边包车型地铁例证中将相称起码含有3个字母 c 的结果:
egrep ‘c{3,}’ FILENAME

运用 -e 选项寻觅全部相称 ‘–test–‘ 的结果。grep 会尝试把 ‘–test–‘
作为二个选项深入剖析:
grep -e ‘–test–‘ FILENAME