20170726 文本处理工具(二) grep 正则表达式

一、grep 文本搜索工具

语法:

grep [OPTIONS] PATTERN [FILE...]

选项:

-v     
-i     
-n     
-c     
-o     
-q     
-A #   
-B #   
-C #   
-e     
-w     
-E     
-F     

实验:

  1. 在/etc/passwd中搜索不包含nologin字符串的行
    命令:grep -v nologin /etc/passwd

    20170726 文本处理工具(二) grep 正则表达式_第1张图片

  2. 在/etc/passwd中搜索包含tom(不分大小写)字符串的行
    命令:grep -i tom /etc/passwd

  3. 在/etc/passwd显示所有搜索到的bash字符串,并在字符串前输出其所在的行号
    命令:grep -on bash /etc/passwd

    20170726 文本处理工具(二) grep 正则表达式_第2张图片

  4. 在/etc/passwd中搜索包含mail的行,并且显示其后三行/前三行/前后各三行
    命令:

grep -A 3 mail /etc/passwd
grep -B 3 mail /etc/passwd
grep -C 3 mail /etc/passwd
20170726 文本处理工具(二) grep 正则表达式_第3张图片
  1. 在/etc/passwd中搜索有单词root,shutdown,bin的行
    命令:grep -we root -we shutdown -we bin /etc/passwd
    20170726 文本处理工具(二) grep 正则表达式_第4张图片

二、正则表达式 regular expressions

(一)定义:

由一类特殊字符及文本字符所编写的模式,其中有些字符(元字符)不表示字符字面意义,而表示控制或通配的功能。

(二)程序支持:

grep, sed, awk, vim等

(三)分类:

基本正则表达式(BRE)
扩展正则表达式(ERE)

(四)元字符分类:

字符匹配、匹配次数、位置锚定、分组

三、基本正则表达式元字符

(一)字符匹配

.             
[]            
[^]           
[:digit:]     
[:alpha:]     
[:alnum:]     
[:lower:]     
[:upper:]     
[:blank:]     
[:space:]     

(二)匹配次数

*           
.*          
\?          
\+          
\{n\}       
\{m,n\}     
\{,n\}      
\{n,\}      
  • 实验:
    新建文本文件file1,文件内容如下:


    20170726 文本处理工具(二) grep 正则表达式_第5张图片
    1. 搜索包含以g开头,中间有任意个数的o,以gle结束的字符串;
      命令:grep go*gle file1

      20170726 文本处理工具(二) grep 正则表达式_第6张图片

    2. 搜索包含以g开头,中间至少2个字母至多5个字母,以gle结束的字符串;
      命令:grep "g[[:alpha:]]\{2,5\}gle" file1

      20170726 文本处理工具(二) grep 正则表达式_第7张图片

    3. 搜索包含以g开头,中间至多1个字母,以gle结束的字符串
      命令:grep "g[[:alpha:]]\?gle" file1

(三)位置锚定

^     
$     
^PATTERN$     
^$     
^[[:space:]]*$     
\< 或\b     
\> 或\b     
\匹配整个单词

(四)分组、或者

  • 分组:\(\)将一个或多个字符捆绑在一起,当作一个整体进行处理
  • \1表示从左侧起第一个左括号以及与之匹配右括号之间的模式所匹配到的字符,以此类推
  • 例如:
\(string1\+\(string2\)*\)
\1:string1\+\(string2\)*     \2:string2
  • 后向引用:引用前面的分组括号中的模式所匹配字符,而非模式本身
  • 或者:\|
abc\|cd       
a\|bc         
\(a\|b\)c     
  • 实验:
    1. 在/etc/passwd搜索以a开头的用户及其UID,并且按照UID从大到小排序
      命令:grep "^a" /etc/passwd | cut -d: -f1,3 | sort -nr -t: -k2

      20170726 文本处理工具(二) grep 正则表达式_第8张图片

    2. 在/etc/passwd搜索以s开头中间至少1个英文或数字字符以d结束的单词,英文不分大小写
      命令:grep -i "\" /etc/passwd

      20170726 文本处理工具(二) grep 正则表达式_第9张图片

    3. 在/etc/passwd搜索用户名以t开头,且同行包含与用户名相同单词的行
      命令:grep "\(^t.*\>\).*\1" /etc/passwd


      可以从上图看到,tim用户所在的行后tam单词也匹配模式,但是并未搜索到。这证明后向引用前方分组括号中所匹配的字符,而非模式本身。

四、egrep和扩展正则表达式

(一)egrep

egrep = grep -E ,语法与grep相同

(二)扩展正则表达式元字符

  • 扩展正则表达式与基本正则表达式的语法基本相同,仅部分元字符删减了\符号
  • 字符匹配,扩展正则表达式字符匹配元字符与基本正则表达式相同
.       
[]      
[^]     
  • 匹配次数
*         
?         
+         
{m}       
{m,n}     
  • 位置锚定,扩展正则表达式位置锚定元字符与基本正则表达式相同
^          
$          
\<, \b     
\>, \b     
  • 分组、或者
()             
\1, \2,...     
abc|cd         
a|bc           
(a|b)c         

你可能感兴趣的:(20170726 文本处理工具(二) grep 正则表达式)