grep一族正则表达式及用法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了grep一族正则表达式及用法相关的知识,希望对你有一定的参考价值。

grep家族属于Linux上文本处理三剑客之一,说到这里我们就先说说其他那两个剑客:

其一sed:全称流编辑器,行编辑器,文本编辑工具由英文名Steam EDitor缩写而来;

sed是一个很好的文件处理工具,本身是一个管道命令,主要是以行为单位进行处理,可以将数据行进行替换、删除、新增、选取等特定工作;

其二 awk相比对与sad比较优秀,运行效率高,对格式化的文本处理能力超强。在其对数据分析并生成报告时,显得尤为强大;

        sed & awk的比较:

sed命令的功能同awk类似,差别在于,sed简单,对列处理的功能要差一些,awk的功能复杂,对列处理的功能比较强大;

grep: 是由Globally search aRegular Expression and Print缩写演变而来,是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来;

    grep命令:

作用:文本搜索工具,根据用户指定的“pattern(过滤条件)”对目标文本逐行进行匹配检查;打印出符合条件的行;

模式:由文本字符及正则表达式元字符所编写的过滤条件;

   

    grep [OPTION]  PATTERN [FILE…]

 

     常用选项:

-? :同时显示匹配行上下的?行,如:grep -2 pattern filename同时显示匹配行的上下2行;

-b,--byte-offset:打印匹配行前面打印该行所在的块号码;

-c,--count:只打印匹配的行数,不显示匹配的内容;

-h,--no-filename:当搜索多个文件时,不显示匹配文件名前缀;

-i,--ignore-case:忽略大小写差别;

-o,--only-matching:只显示正则表达式匹配的部分。(show only the part of a line matchingPATTERN);

-q,--quiet:取消显示,只返回退出状态。0则表示找到了匹配的行;

-l,--files-with-matches:打印匹配模板的文件清单;

-L,--files-without-match:打印不匹配模板的文件清单;

-n,--line-number:在匹配的行前面打印行号;

-v,--revert-match:反检索,只显示不匹配的行;

-R, -r, --recursive:递归的读取目录下的所有文件,包括子目录。 比如grep -R ‘pattern‘ test会在 test 及其子目录下的所有文件中,匹配 pattern;

 

基本正则表达式元字符:

^:锚定行的开始 如:‘^grep‘匹配所有以grep开头的行;

$:锚定行的结束 如:‘grep$‘匹配所有以grep结尾的行;

.:匹配任意单个字符;

*:匹配零个或多个先前字符如:‘ *grep‘ (注意*前有空格)匹配所有零个或多个空格后紧跟grep的行,需要用egrep 或者grep带上 -E 选项。 .*一起用代表任意字符;

[]:匹配一个指定范围内的字符,如‘[Gg]rep‘匹配Grep和grep;

[^]:匹配一个不在指定范围内的字符,如:‘[^A-FH-Z]rep‘匹配不包含A-F和H-Z的一个字母开头,紧跟rep的行;

\<:锚定单词的开始,如:‘\<grep‘匹配包含以grep开头的单词的行;

\>:锚定单词的结束,如‘grep\>‘匹配包含以grep结尾的单词的行;

x\{m\}:重复字符x,m次,如:‘o\{5\}‘匹配包含5个o的行;

x\{m,\}:重复字符x,至少m次,如:‘o\{5,\}‘匹配至少有5个o的行;

x\{m,n\}:重复字符x,至少m次,不多于n次,如:‘o\{5,10\}‘匹配5--10个o的行;

\+:匹配一个或多个先前的字符。如:‘[a-z]\+able‘,匹配一个或多个小写字母后跟able的串,如loveable, enable, disable等;

\?:匹配0或一个先前的字符。如:‘gr\?p‘匹配gr后跟一个或没有字符,然后是p的行;

a\|b\|c:匹配a或b或c。如:grep | sed匹配grep或sed;

\(\):分组符号,如:love\(ab\le\|rs\)ov\+匹配loveable或lovers,匹配一个或多个ov;

 

Posix字符类

为了在不同国家的字符编码中保持一致,POSIX(The Portable Operating System Interface)增加了特殊的字符类,要把它们放到[]号内才能成为正则表达式在linux下的grep除fgrep外,都支持POSIX的字符类。

[:alnum:]:文字数字字符;

[:alpha:]:文字字符;

[:digit:]:数字字符;

[:graph:]:非空字符(非空格、控制字符);

[:lower:]:小写字符;

[:punct:]:标点符号;

[:space:]:所有空白字符(新行,空格,制表符);

[:upper:]:大写字符;

 

 

egrep命令是一个搜索文件获得模式,使用该命令可以任意搜索文件中的字符串和符号,也可以为你搜索一个多个文件的字符串,一个提示符可以是单个字符、一个字符串、一个字、一个句子支持使用扩展正则表达式的grep命令,相当于grep –E。

 

    egrep[OPTION[PATTERN [FILE…..]

 

    扩展正则表达式的元字符:

       字符匹配:

           . :任意单个字符;

           [] :范围内任意单个字符;

           [^]:范围外的任意字符;

 

       匹配次数:

           *:任意次;

           ?:0次或1次;

           +:1次或多次;

           {m}:匹配m次;

           {m,n}:至少m次,至多n次;

注意: egrep 命令与 grep 命令带-E 标志是一样的,除了错误消息和使用消息不同以及 -s 标志的功能不同之外。

egrep命令会显示包含该匹配行的文件,如果您指定了多于一个 File 参数的话。对 shell 有特殊含义的字符 ($,*, [, |, ^, (, ), \ ) 出现在 Pattern 参数中时必须带双引号。如果 Pattern 参数不是简单字符串,通常必须用单引号将整个模式括起来。在表达式中比如 [a-z],减号表示通过当前整理序列。整理序列可以定义等价的类以供在字符范围中使用。它使用了快速确定性的算法,有时需要外部空间。

注意:

1.行被限制在 2048 字节;

2.段落(在 -p 标志下)当前限制在 5000 字符长;

3.不要在特殊文件上运行 grep 命令,因为它会产生不可预测的结果;

4.输入行不应该包含 NULL 字符;

5.输入文件应该以换行符结束;

6.尽管有些标志可以同时被指定,但是有些标志会覆盖其他的标志。例如,如果同时指定 -l 和 -n ,只有文件名写入到标准输出中去;

 

-b在每行前面加上找到该行的块号码。使用此标志有助于按照上下文查找磁盘块号码。-b 标志不能用于来自标准输入和管道的输入;

-c仅显示匹配行的计数;

-e 模式 指定一个模式。这象一个简单的模式,但是它在 模式 以一个 -(负号)开始时很有用;

-fStringFile 指定包含字符串的文件;

-h当处理多个文件时排除文件名;

-i当进行比较时忽略字符的大小写;

-l 列出包含匹配行的文件名(一次)。文件名之间用换行符加以分隔。如果搜索标准输入,会返回一个"(StandardInput)" 路径名;

-n在每行之前加上该行在文件中的相对行号

-p[Separator] 显示包含匹配行的整个段落。段落之间将按照分隔符 Separator参数指定的段落分隔符加以定界,这些分隔符是与搜索模式有着相同格式的模式。包含段落分隔符的行将仅用作分隔符;它们不会被包含在输出中。缺省的段落分隔符是空白行;

-q禁止所有的输出到标准输出,不管匹配行。如果选中输入行,以 0 状态退出;

-s仅显示出错消息。这点对检查状态有用;

-v显示除了与指定的模式匹配的行之外的所有行;

-w执行单词搜索;

-x显示与指定模式精确匹配而不含其它字符的行;

-y当进行比较时忽略字符的大小写;

 

   

 

fgrepgrep 命令搜索 File 参数指定的输入文件(缺省为标准输入)中的匹配模式的行。fgrep 命令特别搜索 Pattern 参数,它们是固定的字符串。如果在 File 参数中指定一个以上的文件 fgrep 命令将显示包含匹配行的文件。

fgrep [ -h] [ -i] [ -s] [-v] [ -w ] [ -x] [ -y ] [ [ -b] [ -n] | [ -c | -l | -q ] ] [ -pSeparator]{Pattern | -ePattern | -fStringFile} [File...]

fgrep 命令于 grep 和 egrep 命令不同,因为它搜索字符串而不是搜索匹配表达式的模式。fgrep 命令使用快速的压缩算法。$, *, [, |, (, ) 和 \ 等字符串被 fgrep 命令按字面意思解释。这些字符并不解释为正则表达式,但它们在 grep 和 egrep 命令中解释为正则表达式。因为这些字符对于 shell 有特定的含义,完整的字符串应该加上单引号(‘ ... ’)。. 如果没有指定文件, fgrep 命令假定标准输入。一般,找到的每行都复制到标准输出中去。如果不止一个输入文件,则在找到的每行前打印文件名。

1. fgrep 命令和带 -F 标志的 grep命令是一样的但出错和用法消息不同-s 标志功能也不同;

2.每行限制在 2048 个字节;

3.段落(-p 标志下)目前限制在5000个字符的长度;

4.不要在特定的文件中运行 grep 命令,因为会产生不可预料的结果;

5.输入行不能包含空字符;

6.输入文件应该以换行字符结尾;

7. 虽然可以同时指定很多标志,但某些标志会覆盖其余的标志。例如,如果同时指定 -l 和 -n ,只有文件名写入到标准输出中去;

常用选项:

-b 在找到的每行之前添加行所在的块编号。使用此标志有助于按照上下文查找磁盘块号码。-b 标志不能用于标准输入或者管道输入。

-c仅显示匹配行的计数。

-e 模式 指定模式。这个工作模式很简单,但当此模式以 a-(减号)开头时却是很有用的。

-fStringFile 指定包含字符串的文件。

-h当多个文件被处理时隐藏文件名。

-i当进行比较时忽略字母的大小写。

-l只列出包含匹配行的文件名(一次)。文件名之间用换行符分隔。

n将文件中每行的相对行号置于行前。

-q 禁止所有写入到标准输出的操作,不管是否为匹配行。如果选中输入行,以 0 状态退出。

-s仅显示出错消息。这在检查状态时很有用。

-v显示除了匹配特定模式的行以外的所有行。

-w执行单词搜索。

-x显示匹配模式的行,要求无额外的字符

-y当进行比较时忽略字符的大小写。

 

练习:

1、显示/etc/passwd文件中不以bash结尾的行;技术分享

2、找出/etc/passwd文件中的三位或四位数;技术分享

3、找出/etc/grub2.cfg文件中,以至少一个空白字符开头,后面又跟了个白字符的行;

技术分享技术分享

4、找出“netstat –tan”命令的结果中,以“LISTEN”后跟0或多个空白字符结尾的行;技术分享

5、找出“fdisk –l”命令的结果中,包含以/dev/后跟sd或hd及一个小字母的行;

方法一:

技术分享

方法二:

技术分享

6、找出“ldd /usr/bin/cat”的命令的结果中文件路径;

技术分享



7、找出/proc/meminfo文件中所有以大写或小写s开头的行;至少用三种形式实现;

方法一:

技术分享

方法二:

技术分享

方法三:

技术分享

8、显示当前系统上root、centOS或slackware用户的相关信息;技术分享

9、echo输出一个绝对路径,使用egrep取出其基名;

技术分享

10、找出ifconfig命令结果中的1-255之间的整数;

技术分享

 

 

 

 


本文出自 “11286111” 博客,请务必保留此出处http://11296111.blog.51cto.com/11286111/1750305

以上是关于grep一族正则表达式及用法的主要内容,如果未能解决你的问题,请参考以下文章

grep及正则表达式用法总结

grep和egrep命令及相应的正则表达式用法总结

grepegrep及相应的正则表达式和用法

grepegrep及相应的正则表达式和用法

正则表达式和grep用法,及文本查看处理工具

llinux文本三剑客之grepegrep及相应的正则表达式和用法