文本处理工具之grep

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了文本处理工具之grep相关的知识,希望对你有一定的参考价值。

1、linux文本处理工具:

    grep:文本过滤工具,可以基于字符串和PATTERN进行过滤

    sed:流编辑器

    awk:linux上的实现为gawk,文本报告生成器,格式化文本。

以上三个工具都会用到正则表达式。


2、正则表达式介绍:

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


正则表达式分类:

    基本正则表达式(BRE)

    扩展正则表达式(ERE)


3、grep:global search regular expression and printout the line;全文搜索每一行,对字符串及模式进行匹配,然后在输出匹配的行。


grep作用:文本搜索工具,根据用户指定的“模式(过滤条件)”,对目标文本逐行进行匹配检查,打印匹配到的行。


模式(过滤条件):是指由正则表达式的元字符及文本字符所编写出的过滤条件。


另:

grep:支持基本正则表达式,-E,支持扩展正则表达式

egrep:支持扩展正则表达式,-G,支持基本正则表达式

fgrep:不支持正则表达式,可以和-E、-G一起使用;过滤速度最快


4、grep命令:

命令格式:

    grep [OPTIONS] PATTERN [FILE...]

     grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...]

[OPTIONS]:

    --color=auto:对匹配到的文本做高亮显示

    -i:忽略字符大小写;

    -o:仅显示匹配到的行

    -v:显示不能被模式匹配到的行

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

    -q:静默模式,不输出任何消息

    

    -A # :被模式匹配的行后面#行显示出来;after;    

    -B # :被模式匹配的行前面#行显示出来;before;  

    -C # :被模式匹配的行前后面#行显示出来;after;  

5、基本正则表达式元字符:

分类:

    字符匹配  . [] [^]

    次数匹配  * \? \+ \{m\} \{m,n\}

    位置锚定  \< \>  \b ^ $  

    分组及引用 \( \)

分类具体介绍:

①字符匹配:

    .  :匹配任意单个字符

    []  :匹配指定范围内的任意单个字符

    [^] :匹配制定范围外的任意单个字符

[[:digit:]] 0-9数字集合

[[:lower:]] 所有小写字母中的任意一个字符

[[:upper:]] 所有大写字母中的任意一个字符

[[:alpha:]] 所有大小写字母中的任意一个字符

[[:alnum:]] 所有字母及数字中的一个字符

[[:punct:]] 所有的标点符号中的任意一个字符

[[:space:]] 空格字符


②次数匹配:默认工作于贪婪模式,能匹配多长就匹配多长;

    * :匹配其前面的字符任意次;0次、1次、多次

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

    \? :匹配其前面的字符0次或1次;前面的字符至多出现一次;

    \+ :匹配其前面的字符1次或多次;前面的字符至少出现一次;

    \{m\} :匹配其前面的字符m次

    \{m,n\} :匹配其前面的字符至少m次,至多n次;

    \{0,n\} :匹配其前面的字符至多n次;

    \{m,\} :匹配其前面的字符至少m次;

如:grep “x\{2,5\}y" test.txt


③位置锚定:

    ^ :行首锚定;用于模式的最左侧,如 ^root

    $ : 行尾锚定;用于模式的最右侧,如 root$

    ^PATTERN$ :用PATTERN来匹配整行;

    ^$ :空白行

    ^[[:space:]]*$ :匹配空白字符任意次;空白行,或包括空白字符的行

    \<或\b :词首锚定,用于单词的左侧,建议用\<

    \>或\b :词尾锚定,用于单词的右侧,建议用\>

注意:单词是指由非特殊字符组成的连续字符(字符串)


④分组及引用

    \( \):将一个或多个字符捆绑在一起,当作一个整体进行处理;如:\(xy\)*ab表示匹配xy出现任意次后跟ab字符的行;

注意:分组括号中模式匹配到的内容会被正则表达式引擎自动记录与内部的变量中,这些变量为:

    \1:模式从左侧起,第一个左括号与之匹配的右括号之间的模式匹配到的字符

    \2:模式从左侧起,第二个左括号与之匹配的右括号之间的模式匹配到的字符

    \...:模式从左侧起,第...个左括号与之匹配的右括号之间的模式匹配到的字符

如:

he likes his lover

he loves his lover

she likes her liker

she loves her liker

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

后项引用:引用前面的分组括号中的模式所匹配到的字符。



6、扩展正则表达式元字符:

分类:

    字符匹配  . [] [^]

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

    位置锚定  \< \>  \b ^ $  

    分组及引用 ( )

    或

分类具体介绍:

①字符匹配:

    .  :匹配任意单个字符

    []  :匹配指定范围内的任意单个字符

    [^] :匹配制定范围外的任意单个字符

[[:digit:]] 0-9数字集合

[[:lower:]] 所有小写字母中的任意一个字符

[[:upper:]] 所有大写字母中的任意一个字符

[[:alpha:]] 所有大小写字母中的任意一个字符

[[:alnum:]] 所有字母及数字中的一个字符

[[:punct:]] 所有的标点符号中的任意一个字符

[[:space:]] 空格字符


②次数匹配:默认工作于贪婪模式,能匹配多长就匹配多长;与基本正则表达式的区别是少了转义字符"\".

   * :匹配其前面的字符任意次;0次、1次、多次

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

    ? :匹配其前面的字符0次或1次;前面的字符至多出现一次;

    + :匹配其前面的字符1次或多次;前面的字符至少出现一次;

    {m} :匹配其前面的字符m次

    {m,n} :匹配其前面的字符至少m次,至多n次;

    {0,n} :匹配其前面的字符至多n次;

    {m,} :匹配其前面的字符至少m次;

如:grep “x{2,5}y" test.txt


③位置锚定:

    ^ :行首锚定;用于模式的最左侧,如 ^root

    $ : 行尾锚定;用于模式的最右侧,如 root$

    ^PATTERN$ :用PATTERN来匹配整行;

    ^$ :空白行

    ^[[:space:]]*$ :匹配空白字符任意次;空白行,或包括空白字符的行

    \<或\b :词首锚定,用于单词的左侧,建议用\<

    \>或\b :词尾锚定,用于单词的右侧,建议用\>

注意:单词是指由非特殊字符组成的连续字符(字符串)


④分组及引用 与基本正则表达式的区别是少了转义字符"\".

    ( ):将一个或多个字符捆绑在一起,当作一个整体进行处理;如:\(xy\)*ab表示匹配xy出现任意次后跟ab字符的行;

注意:分组括号中模式匹配到的内容会被正则表达式引擎自动记录与内部的变量中,这些变量为:

    \1:模式从左侧起,第一个左括号与之匹配的右括号之间的模式匹配到的字符

    \2:模式从左侧起,第二个左括号与之匹配的右括号之间的模式匹配到的字符

    \...:模式从左侧起,第...个左括号与之匹配的右括号之间的模式匹配到的字符

如:

he likes his lover

he loves his lover

she likes her liker

she loves her liker

grep -E "(l..e).*\1 test.txt

后项引用:引用前面的分组括号中的模式所匹配到的字符。


⑤或 a|b

a|b :表示匹配整个左侧的a或整个左侧的b

如:c|Cat :表示c或者Cat

(C|c)at:表示Cat或者cat
































5、基本正则表达式元字符:

分类:

    字符匹配  . [] [^]

    次数匹配  * \? \+ \{m\} \{m,n\}

    位置锚定  \< \>  \b ^ $  

    分组及引用 \( \)

分类具体介绍:

①字符匹配:

    .  :匹配任意单个字符

    []  :匹配指定范围内的任意单个字符

    [^] :匹配制定范围外的任意单个字符

[[:digit:]] 0-9数字集合

[[:lower:]] 所有小写字母中的任意一个字符

[[:upper:]] 所有大写字母中的任意一个字符

[[:alpha:]] 所有大小写字母中的任意一个字符

[[:alnum:]] 所有字母及数字中的一个字符

[[:punct:]] 所有的标点符号中的任意一个字符

[[:space:]] 空格字符


②次数匹配:默认工作于贪婪模式,能匹配多长就匹配多长;

    * :匹配其前面的字符任意次;0次、1次、多次

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

    \? :匹配其前面的字符0次或1次;前面的字符至多出现一次;

    \+ :匹配其前面的字符1次或多次;前面的字符至少出现一次;

    \{m\} :匹配其前面的字符m次

    \{m,n\} :匹配其前面的字符至少m次,至多n次;

    \{0,n\} :匹配其前面的字符至多n次;

    \{m,\} :匹配其前面的字符至少m次;

如:grep “x\{2,5\}y" test.txt


③位置锚定:

    ^ :行首锚定;用于模式的最左侧,如 ^root

    $ : 行尾锚定;用于模式的最右侧,如 root$

    ^PATTERN$ :用PATTERN来匹配整行;

    ^$ :空白行

    ^[[:space:]]*$ :匹配空白字符任意次;空白行,或包括空白字符的行

    \<或\b :词首锚定,用于单词的左侧,建议用\<

    \>或\b :词尾锚定,用于单词的右侧,建议用\>

注意:单词是指由非特殊字符组成的连续字符(字符串)


④分组及引用

    \( \):将一个或多个字符捆绑在一起,当作一个整体进行处理;如:\(xy\)*ab表示匹配xy出现任意次后跟ab字符的行;

注意:分组括号中模式匹配到的内容会被正则表达式引擎自动记录与内部的变量中,这些变量为:

    \1:模式从左侧起,第一个左括号与之匹配的右括号之间的模式匹配到的字符

    \2:模式从左侧起,第二个左括号与之匹配的右括号之间的模式匹配到的字符

    \...:模式从左侧起,第...个左括号与之匹配的右括号之间的模式匹配到的字符

如:

he likes his lover

he loves his lover

she likes her liker

she loves her liker

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

后项引用:引用前面的分组括号中的模式所匹配到的字符。



6、扩展正则表达式元字符:

分类:

    字符匹配  . [] [^]

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

    位置锚定  \< \>  \b ^ $  

    分组及引用 ( )

    或

分类具体介绍:

①字符匹配:

    .  :匹配任意单个字符

    []  :匹配指定范围内的任意单个字符

    [^] :匹配制定范围外的任意单个字符

[[:digit:]] 0-9数字集合

[[:lower:]] 所有小写字母中的任意一个字符

[[:upper:]] 所有大写字母中的任意一个字符

[[:alpha:]] 所有大小写字母中的任意一个字符

[[:alnum:]] 所有字母及数字中的一个字符

[[:punct:]] 所有的标点符号中的任意一个字符

[[:space:]] 空格字符


②次数匹配:默认工作于贪婪模式,能匹配多长就匹配多长;与基本正则表达式的区别是少了转义字符"\".

   * :匹配其前面的字符任意次;0次、1次、多次

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

    ? :匹配其前面的字符0次或1次;前面的字符至多出现一次;

    + :匹配其前面的字符1次或多次;前面的字符至少出现一次;

    {m} :匹配其前面的字符m次

    {m,n} :匹配其前面的字符至少m次,至多n次;

    {0,n} :匹配其前面的字符至多n次;

    {m,} :匹配其前面的字符至少m次;

如:grep “x{2,5}y" test.txt


③位置锚定:

    ^ :行首锚定;用于模式的最左侧,如 ^root

    $ : 行尾锚定;用于模式的最右侧,如 root$

    ^PATTERN$ :用PATTERN来匹配整行;

    ^$ :空白行

    ^[[:space:]]*$ :匹配空白字符任意次;空白行,或包括空白字符的行

    \<或\b :词首锚定,用于单词的左侧,建议用\<

    \>或\b :词尾锚定,用于单词的右侧,建议用\>

注意:单词是指由非特殊字符组成的连续字符(字符串)


④分组及引用 与基本正则表达式的区别是少了转义字符"\".

    ( ):将一个或多个字符捆绑在一起,当作一个整体进行处理;如:\(xy\)*ab表示匹配xy出现任意次后跟ab字符的行;

注意:分组括号中模式匹配到的内容会被正则表达式引擎自动记录与内部的变量中,这些变量为:

    \1:模式从左侧起,第一个左括号与之匹配的右括号之间的模式匹配到的字符

    \2:模式从左侧起,第二个左括号与之匹配的右括号之间的模式匹配到的字符

    \...:模式从左侧起,第...个左括号与之匹配的右括号之间的模式匹配到的字符

如:

he likes his lover

he loves his lover

she likes her liker

she loves her liker

grep -E "(l..e).*\1 test.txt

后项引用:引用前面的分组括号中的模式所匹配到的字符。


⑤或 a|b

a|b :表示匹配整个左侧的a或整个左侧的b

如:c|Cat :表示c或者Cat

(C|c)at:表示Cat或者cat

以上是关于文本处理工具之grep的主要内容,如果未能解决你的问题,请参考以下文章

linux文本处理三剑客之grep

Linux文本处理之 grep egrep

Linux文本处理工具之grep sed简概

文本处理三剑客之---grep系

文本处理三剑客之-grep

Linux文本处理三剑客之grep