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

Posted

tags:

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

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

                    

一、简介

    

    Linux上文本处理三剑客(引用自马哥教育 ):

    grep, egrep, fgrep:文本搜索工具;基于”pattern“对给定文本进行搜索操作;

    sed:Stream EDitor,流编辑器,行编辑工具;文本编辑工具;

    awk:GNU awk,文本格式化工具;文本报告生成器;

        grep (缩写来自Globally search a Regular Expression and Print)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。Linux的grep家族包括grep、egrepfgrep

        egrep命令是一个搜索文件获得模式,使用该命令可以任意搜索文件中的字符串和符号,也可以为你搜索一个多个文件的字符串,一个提示符可以是单个字符、一个字符串、一个字、一个句子。 (转自百度百科)


二、详解


grep命令


功能说明:查找文件里符合条件的字符串


补充说明:grep指令用于查找内容包含指定的范本样式的文件,如果发现某文件的内容符合所指定的范本样式,预设grep指令会把含有范本样式的那一列显示出来。若不指定任何文件名称,或是所给予的文件名为“-”,则grep指令会从标准输入设备读取数据。


参  数

  --color=auto:对匹配到的文本着色后高亮显示;

  -a或--text   不要忽略二进制的数据。

  -c或--count   计算符合范本样式的列数。

  -C<显示列数>或--context=<显示列数>或-<显示列数>

  除了显示符合范本样式的那一列之外,并显示该列之前后的内容。

  -i或--ignore-case   忽略字符大小写的差别。

  -q或--quiet或--silent   不显示任何信息。

  -v或--revert-match   反转查找。

  -o:仅显示匹配 到的文本自身;

  -n或--line-number   在显示符合范本样式的那一列之前,标示出该列的列数编号。

  -E或--extended-regexp  将范本样式为延伸的普通表示法来使用,支持扩展的正则表达式。


默认 grep 命令, 对匹配到的文本着色后高亮显示,使用 -color=auto 选项。

使用 alias 命令,查看(如图) :

技术分享


 用 grep命令查找 /etc/passwd 文件中 含有 “bash” 字符串的行 。

 没有使用 -v 选项的效果:

技术分享

使用-v选项,进行反应查找的效果:

技术分享


-i:忽略字符大小写:

技术分享

 -q或--quiet或--silent    不显示任何信息。

技术分享

-o:仅显示匹配 到的文本自身;

技术分享

-c或--count  计算符合范本样式的列数。

技术分享

-C<显示列数>或--context=<显示列数>或-<显示列数>

技术分享


基本正则表达式元字符:


字符匹配:

.:匹配任意单个字符;

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

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

[0-9] : 表示所有数字 等同于 [[:digit:]]

[a-z] : 表示所有小写字母 等同于 [[:lower:]]

[A-Z] : 表示所有大写字母 等同于 [[:upper:]]

[a-zA-Z] : 表示所有字母 等同于 [[:alpha:]]

[a-zA-Z0-9] : 表示字母和数字 等同于 [[:alnum:]]


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

[[:cntrl:]] : 表示控制字符

[[:punct:]] : 表示标点符号

[[:print:]] : 表示非空字符(包含空格)

[[:space:]] : 表示空白字符

[[:digit:]] :表示所有数字

[[:lower:]] :所有小写字母

[[:upper:]] :所有大写字母

[[:alpha:]] :表示所有字母

[[:alnum:]] :表示所有 字母、数字

[[:punct:]] : 表示所有 标点 符号


匹配次数:

用在要指定其出现的次数的字符后面,用限制其前面的字符要出现的次数;默认工作于贪婪模式;


*匹配前面的字符任意次(0,1或多次);

技术分享

.*:任意长度的任意字符;

技术分享

\+:匹配前面的字符至少1次;

技术分享

\?:匹配前面的0次或1次,即前面的字符可有可无;

技术分享

\{m\}:其前面的字符出现m次,m为非负整数;

技术分享

\{m,n\}:其前面的字符出现m次,m为非负整数;[m,n]

技术分享

\{0,n\}:至多n次;

技术分享

\{m,\}:至少m次;

技术分享


位置锚定:

限制使用模式搜索文本,限制模式所匹配到的文本只能出现于目标文本的哪个位置;

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

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

^PATTERN$:要让PATTERN完全匹配一整行;

^$:空行;

^[[:space:]]*$:

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


\<或\b:词首锚定,用于单词模式的左侧,格式为\<PATTERN, \bPATTERN

\>或\b:词尾锚定,用于单词模式的右侧,格式为PATTERN\>, PATTERN\b

\<PATTERN\>:单词锚定; 


^:行首锚定;

技术分享

$:行尾锚定;

技术分享

^PATTERN$要让PATTERN完全匹配一整行;

为了方便截图,小编 cp 了一份 passwd 到 /tmp 下,并向 passwd 添加内容:

 第一行,为root。

 第二行,为空白行。

技术分享

"^$"为空白行,"^root$":完全匹配含有root的一整行。

技术分享

^[[:space:]]*$

技术分享

表示 两边 是 任意 数字 ,中间 任意字符的 。

技术分享

效果一样的。

技术分享

\<或\b:词首锚定,用于单词模式的左侧,格式为\<PATTERN, \bPATTERN

技术分享

技术分享

\>或\b:词尾锚定,用于单词模式的右侧,格式为PATTERN\>, PATTERN\b

技术分享

\<PATTERN\>:单词锚定;

技术分享

grep的分组:

\(\)

\(ab\):表示ab整体作为匹配字符

\(ab\)* : 表示ab整体作为匹配字符,且匹配任意次

\(ab\)\{1,\}:表示ab整体作为匹配字符,且匹配至少一次

分组还可以后向引用

\1: 引用第一个左括号以及与之对应的右括号所包括的所有内容

\2: 引用第一个左括号以及与之对应的右括号所包括的所有内容

\3: 引用第一个左括号以及与之对应的右括号所包括的所有内容

如test有文本内容如下:

技术分享

grep "\(l..e\).*\1r" test2 表示匹配结果如下:

技术分享


egrep:

支持使用扩展正则表达式的grep命令,相当于grep -E;

egrep [OPTIONS] PATTERN [FILE...]

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

字符匹配:

.:任意单个字符

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

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

匹配次数:

*:任意次;

?:0次或1次;

+:1次或多次;

{m}:匹配m次;

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

{0,n}

{m,}


位置锚定:

^:行首

$:行尾

\<, \b:词首

\>, \b:词尾


分组及引用:

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

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

或者:

a|b:a或者b

C|cat:表示C或cat

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


练习:

1、显示/etc/passwd文件中不以nologin结尾的行;

~]# egrep -v "nologin$" /etc/passwd

技术分享

2、找出/etc/passwd文件中的含有root字符串的行;

技术分享

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

 ]# egrep "[^$]^[[:space:]]" /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、mageedu或yu用户的相关信息;

技术分享

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

~]# echo /etc/passwd/ | egrep -o "[^/]+/?$"

技术分享

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

~]# ifconfig | egrep "\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>"

技术分享

技术分享

11、添加用户bash、testbash、basher及nologin,要求前三个用户的默认shell为/bin/bash,nologin的默认shell为/sbin/nologin,而后找出其用户名与shell名相同的用户;

~]# egrep "^([[a-z0-9]+)\>.*\1$" /etc/passwd

技术分享

本文出自 “完美世界” 博客,请务必保留此出处http://angelababy.blog.51cto.com/6326130/1748736

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

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

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

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

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

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

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