一、为什么要用到文本过滤工具?

    Linux的基本概念之一,一切皆文件,平时我们在做大多数操作的时候,都是在对文件进行操作,此时我们就需要一种文本搜索工具,可以根据我们所指定的特定格式的内容,过滤出我们想要的段落,从而实现在一段复杂的文本中,过滤出特定的内容,而我们把这段特定的格式叫做模式;


Global search REgular expression and Printout the line. 

     全局搜索正则表达式并打印出符合条件的行

文本搜索工具,可以根据用户所指定的“模式”(pattern)对目标文件进行过滤,显示被模式匹配到的行;

正则表达式:由一类字符书写的模式,其中有些字符不表示字符的字面意义,而是表示控制或通配功能;

元字符:不表示字面意义,而表示通配功能的字符


正则表达式

  •    基本正则表达式

  •    扩展正则表达式


用法

grep [OPTION]...‘PATTERN’ FILE...

option:

   -v:反向选取,显示出匹配指定模式以外的内容

   -o:仅显示匹配到的内容

   -i:忽略字符大小写

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

   -A#:显示匹配到的行,及其后#行的内容

   -B #:显示匹配到的行,及前#行的内容

   -C #:显示匹配到的行,及其前后# 行的内容

PATTERN:模式,可以是普通的字符串,也可以是正则表达式(模式需加引号)


字符匹配:

.:         匹配任意一个单个字符;


grep、egrep、正则表达式_表达式


*:         匹配其前的任意长度任意字符;

grep、egrep、正则表达式_表达式_02


\?:        匹配其前字符0个或1个;

grep、egrep、正则表达式_grep_03


\+:        匹配其前字符至少一次;

grep、egrep、正则表达式_表达式_04



[:digit:]: 匹配全部数字[0-9]

[:lower:]: 匹配全部小写字母 [a-z]

[:upper:]: 匹配全部大写字母 [A-Z]

[:alpha:]: 匹配全部大小写字母[a-z][A-Z]

[:alnum:]: 匹配大小写字母和数字 [a-z][A-Z][0-9]

[:punct:]: 匹配所有标点符号

[:space:}:  匹配全部空白字符空格、Tab等

[^]:      匹配指定模式以外的字符

grep、egrep、正则表达式_正则_05


\{n\}:    匹配其前字符出现了n次;

grep、egrep、正则表达式_正则_06


\{n,\}:   匹配其前字符出现了至少n次;

grep、egrep、正则表达式_grep_07


\{n,m\}:  匹配其前字符出现了n到m次;

grep、egrep、正则表达式_正则_08

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

grep、egrep、正则表达式_grep_09


位置锚定:

^:        锚定行首

grep、egrep、正则表达式_正则_10

$:        锚定行尾

grep、egrep、正则表达式_正则_11

^$:       锚定空白行

grep、egrep、正则表达式_正则_12


\<:       锚定词首

\>:       锚定词尾

grep、egrep、正则表达式_正则_13


\b:       锚定词首或词尾,功能同 \< 或 \>

grep、egrep、正则表达式_grep_14


分组

\(\):     常用在模式中前面匹配到了指定的字符串,而这段字符后面也需要引用相同的字符串;

\(\):匹配         \1 \2 \3 引用 ;

模式自左而右,引用第# 个左括号以及与其基本右括号之间的模式匹配到的内容;

例:    

1
2
 root:x:0:0::/home/root:/sbin/nologin
tom:x:0:0::/home/tom:/sbin/nologin


此时我想匹配用户名和家目录

       

1
  #   grep ‘\(^\<[[:alpha:]]*\>\).*\1’filename


 

extended grep  :扩展的 grep

注:扩展的和上面用法相同,只是\+、\?、\(\)、\{\} 在扩展中不用转义,此处就不一一举例;

 

1
  egrep   [OPTION] <patter>     filename


字符匹配

   .:      匹配单个任意字符;

   *:      匹配其前字符0次1次或多次


   +:      匹配其前字符至少一次


   ?:      匹配其前字符0次或1次


   [:digit:]:匹配全部数字[0-9]

   [:lower:]:匹配全部小写字母 [a-z]

   [:upper:]:匹配全部大写字母 [A-Z]

   [:alpha:]:匹配全部大小写字母[a-z][A-Z]

   [:alnum:]:匹配大小写字母和数字 [a-z][A-Z][0-9]

   [:punct:]:匹配所有标点符号

   [:space:]:匹配全部空白字符空格、Tab等

[^]:    匹配指定模式以外的字符

{n}:    匹配其前字符出现了n次;

{n,}:   匹配其前字符出现了至少n次;

{n,m}:  匹配其前字符出现了n到m次;

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

 

位置锚定

   ^:      锚定行首

   $:      锚定行尾

   ^$:     锚定空白行

   \<:     锚定词首

   \>:     锚定词尾

   \b:     锚定词首或词尾

 

分组

   ():    常用在模式中前面匹配到了指定的字符串,而这段字符后面也需要引用相同的字符串;

      ():匹配        \1 \2 \3 引用 ;

            模式自左而右,引用第# 个左括号以及与其基本右括号之间的模式匹配到的内容;

 

或者

        a|b:a或者b

        ab|cd:ab或者 cd ,表示整个;

        a(b)|(c)d:这个表示单一一个或;

 

      #  grep -E 'pattern'  file ...

      #  egrep 'pattern' file ...

 

以上就是正则表达式grep、egrep的简单用法,马哥说让不懂的人一看就能懂,具体懂不懂就看你悟性;