在linux上用来处理文本信息最好的工具莫过于使用grep,sed和awk这三种工具了。但是现在我们来介绍正则表达式和grep命令,及用法。

grep, egrep, fgrep:文本过滤工具(模式:pattern)工具; 
grep:基本正则表达式,-E,-F 
egrep:扩展正则表达式, -G,-F 
fgrep:不支持正则表达式, 


Regular Expression ,REGEXP 正则表达式

        正则表达式用来在文件中匹配符合条件的字符串,正则是贪婪匹配(凡是有的一行都列出)。grep,awk,sed等命令可以支持正则表达式。通配符用来在系统中匹配符合条件的文件名,通配符是完全匹配(只列有的)。ls find cp命令不支持正则表达式。 
\ 转义符,后面的字符被grep使用。代表取消特殊符号的含义取消。(使符号的图书含义取消,后面的符号变为纯字符)。

基本正则BRE
字符匹配

.  匹配除换行外的任意一个字符.
[]中括号中的一个字符.  []匹配括号中任意一个字符. 例如[abcd][12345],任意[a-d][1-4]中的任意. 
[^] 括号内除外.
字符集:[:digit:]数字、[:lower:]小写、[:upper:]大写、[:alpha:]字母、[:alnum:]字母数字、[:punct:]标点、[:space:]空格 [][xdigit]16进制

示例:


grep正则和统配符 grep及正则表达式_正则表达式


grep正则和统配符 grep及正则表达式_正则表达式_02


grep正则和统配符 grep及正则表达式_awk_03


grep正则和统配符 grep及正则表达式_grep正则和统配符_04


grep正则和统配符 grep及正则表达式_正则表达式_05


次数匹配:

用于要指定其出现的次数的字符后面,用来限制前面的字符要出现的次数。默认工作在贪婪模式下。 
正则也会统计空格数,但是一个tab和一个space都被认为一个空格。

*       前一个字符匹配0次或任意次;  .*表任意长度的任意字符;
\?     任意字符重复1次,或0次, 即其前面的字符是可有可无的;
\+:    匹配其前面的字符1次或多次,即其前面的字符要出现至少1次。因为+有特殊意思,所以要转义;
\{0,m\} 前面的字符至多m次;
\{n,m\} 前面的字符至少出现n次,最多出现m次;例如[a-z]\{6,8\}匹配6-8位的小写字母;
\{n\}   代表前面的字符恰好出现几次.例如[0-9]\{4\}匹配四位数字,[1][3-8][0-9]\{9\}匹配手机号码;
\{n,\}  前面的数字出现不少于n次.[0-9]\{2,\}表示两位以上的数字;

示例:


grep正则和统配符 grep及正则表达式_正则表达式_06


grep正则和统配符 grep及正则表达式_grep正则和统配符_07


grep正则和统配符 grep及正则表达式_锚定_08


grep正则和统配符 grep及正则表达式_锚定_09


grep正则和统配符 grep及正则表达式_awk_10


grep正则和统配符 grep及正则表达式_grep正则和统配符_11


grep正则和统配符 grep及正则表达式_grep正则和统配符_12




锚定位置:

标定出现的位置

^匹配行首.
例如:   ^hello   任意一hello开头的行;
$匹配行尾.
例如:   hello$  任意一hello结尾的行;
^PATTERN$  用于PATTERN来匹配整行;    
 例如: ^$  匹配空白行;
 例如: ^[[:space:]]*$  空行或包含空白字符的行;

由非特殊字符组成的连续字符(字符串)都称为单词;

\< 或 \b   后面的字符必须做为单词首部出现,\<PATTERN,\bPATTERN;
\> 或 \b   后面出现的任意字符必须以单词的尾部出现.PATTERN\>,PATTERN\b;
\<root\>   \broot\b 以root作为整个单词出现的,独立出现。

示例:


grep正则和统配符 grep及正则表达式_grep正则和统配符_13


grep正则和统配符 grep及正则表达式_正则表达式_14


grep正则和统配符 grep及正则表达式_正则表达式_15


grep正则和统配符 grep及正则表达式_操作系统_16




内容分组及引用:

前面匹配到的后面也原封不动的匹配。相当于匹配两个一模一样的。也叫后向引用。 
后向引用:引用前面的分组括号中的模式所匹配到的字符;

\(PATTERN\) 将一个或多个字符捆绑在一起,当作一个整体进行处理; 
\(ab\)*  ab出现零次或任意次
Note:分组括号中的模式匹配 到的内容会被正则表达式引擎自动记录于内部的变量中,这些变量为:
    \1:模式从左侧起,第一个左括号以及与之匹配的右括号之间的模式所匹配到的字符;
    \2:模式从左侧起,第二个左括号以及与之匹配的右括号之间的模式所匹配到的字符;
    \n:模式中第n个左括号以及与之匹配的右括号之间的模式所匹配的字符串;
    ...

grep "\(l..e\).*\1" lovers.txt

例如:


grep正则和统配符 grep及正则表达式_锚定_17


扩展正则表达式:egrep ERE

grep -E 或 egrep [OPTIONS] PATTERN [FILE…] 
扩展正则表达式的元字符:

字符匹配:

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

次数匹配:

*        *前面的字符任意次,0,1或多次;
?        ?前面的字符0次或1次,其前的字符是可有可无的;
+        +前面的字符其前字符至少1次;
{m}      {m}其前的字符m次;
{m,n}    {m,n}前面的字符至少m次,至多n次; 
{0,n}    {0,n}前面的字符至多出现n次,至少0次。
{m,}      {m,}前面的字符前面的字符至少出现m次。

位置锚定

^:行首锚定;
$:行尾锚定;
\<, \b:词首锚定;
\>, \b:词尾锚定;

分组及引用:

   (PATTERN):分组;括号内的模式匹配到的字符会被记录于正则表达式引擎的内部变量中;

提供后向引用:\1, \2, ...

或者:

a|b:a或者b;
C|cat:C或cat,整个左侧或右侧
(c|C)at:cat或Cat
a|bc:匹配a或bc ,或者指整个左边或右边

例如:


grep正则和统配符 grep及正则表达式_awk_18


grep正则和统配符 grep及正则表达式_操作系统_19

fgrep–fast grep

不支持正则表达式,不需要正则时效果好。 


grep: Global search REgular expression and Print out the line.

作用:文本搜索工具,根据用户指定的“模式(过滤条件)”对目标文本逐行进行匹配检查;打印匹配到的行,默认支持的是基本正则表达式; 
模式:由正则表达式的元字符及文本字符所编写出的过滤条件,需要加引号;

下面是grep的一些常用选项。

grep [options] PATTERN [FILE...] 
grep  [OPTIONS]  [-e PATTERN | -f FILE]  [FILE...]
    --color   把搜到的关键字颜色表示;
    --color==auto  搜索出的关键字用颜色表示高亮显示;    
    -i  ignorecase 忽略大小写;
    -v,--invart-match  显示没有被模式匹配的行;
    -o 只显示模式匹配的字符串本身;
    -q ,--quiet,--silent:静默模式,即不输出任何信息;
    -d   可查目录下的文件名,默认查的是文本;
    -n 输出行号;   
    -E , --extended-regexp  支持使用扩展正则表达式元字符(grep使用基本正则表达式 ); 
    -F    不使用正则表达式。  
    -G   使用基本正则。   
    -P --perl-regexp  支持pcre ,perl的正则。
    -e 多模式机制;  
    -f FILE,--filefile:每行包含了一个pattern的文本文件,即gerp script;
    -A #   当grub匹配到,显示后#行   
    -B #    同上显示前面的#行  
     -C #    显示前后#行


完!


转载于:https://blog.51cto.com/wangwaiwei/1750095