grep及正则表达式应用

grep:文本过滤(模式:pattern)工具

grep家族介绍:

grep:标准grep命令,支持标准的正则表达式  BRE 

egrep:扩展的grep命令,支持扩展的正则表达式  ERE

fgrep:快速的grep命令,不支持正则表达式

grep 图例.jpg

grep作用:

文本搜索工具,根据用户指定的“模式”对目标文本逐行进行匹配检查;打印匹配到的行;
模式:由正则表达式字符及文本字符所编写的过滤条件;
REGEXP:由一类特殊字符及文本字符所编写的模式,其中有些字符不表示字符字面意义,而表示控制或通配的功能;

grep一般格式为:

grep [选项] 正则表达式 [文件]

grep选项:

--color=auto: 对匹配到的文本着色显示;centos 7默认带
-v: 显示不能够被pattern匹配到的行;
-i: 忽略字符大小写;
-o: 仅显示匹配到的字符串;
-q: 静默模式,不输出任何信息;
-A #:after, 后#行
-B #: before, 前#行
-C #:context, 前后各#行
-E:等同于egrep,使用扩展的正则表达式

-v:

grep -v "bin/bash$" /etc/passwd

-o:

grep -o "\bt.*p\b" /etc/passwd

基本正则表达式元字符:

字符匹配:

.:匹配任意单个字符;
[]:匹配指定范围内的任意单个字符
[^]:匹配指定范围外的任意单个字符
还支持一些特殊的专用字符
[:digit:]:数字
[:lower:]:任意小写字母
[:upper:]:任意大写字母
[:alpha:]:任意大小写字母
[:alnum:]:任意数字或字母
[:space:]:空格字符
[:punct:]:标点符号

匹配次数:用在要指定次数的字符后面,用于指定前面的字符要出现的次数;

*:匹配前面的字符任意次;
贪婪模式
.*:任意长度的任意字符;
\?:匹配其前面的字符0或1次;即前面的可有可无;
\+:匹配其前面的字符至少1次;
\{m\}:匹配前面的字符m次;
\{m,n\}:匹配前面的字符至少m次,至多n次;
\{0,n\}:匹配前面的字符至多n次;
\{m,\}:匹配前面的字符至少m次;

位置锚定:

^:行首锚定;用于模式的最左侧;
$:行尾锚定;用于模式的最右侧;
^PATTERN$: 用于模式匹配整行;
^$: 空行;
^[[:space:]]*$:空白行
\< 或 \b:词首锚定;用于单词模式的左侧;
\> 或 \b:词尾锚定;用于单词模式的右侧;
\<PATTERN\>:匹配整个单词;

分组:

\(\):将一个或多个字符捆绑在一起,当作一个整体进行处理;
\(xy\)*ab
Note: 分组括号中的模式匹配到的内容会被正则表达式引擎记录于内部的变量中,这些变量的命名方式为: \1, \2, \3, ...
\1: 从左侧起,第一个左括号以及与之匹配右括号之间的模式所匹配到的字符;
\(ab\+\(xy\)*\):
\1: ab\+\(xy\)*
\2: xy
后向引用:引用前面的分组括号中的模式所匹配字符,(而非模式本身)

练习:

1、显示/proc/meminfo文件中以大小s开头的行;(要求:使用两种方式)

grep -i "^s" /proc/meminfo
grep  "^[sS]" /proc/meminfo

2、显示/etc/passwd文件中不以/bin/bash结尾的行;

grep -v "/bin/bash$" /etc/passwd

3、显示/etc/passwd文件中ID号最大的用户的用户名;

sort -t: -k3 -n /etc/passwd|cut -d: -f1|tail -n 1

4、如果用户root存在,显示其默认的shell程序;

id root &>/dev/null && grep "^root\b" /etc/passwd |cut -d: -f7

5、找出/etc/passwd中的两位或三位数;

grep "\b[0-9]\{2,3\}\b" /etc/passwd

6、显示/etc/rc.d/rc.sysinit文件中,至少以一个空白字符开头的且后面存非空白字符的行;

grep --color=auto "[[:space:]]\+[^[:space:]]" /etc/rc.d/rc.sysinit

7、找出"netstat -tan"命令的结果中以'LISTEN'后跟0、1或多个空白字符结尾的行;

netstat -tan | grep "\bLISTEN[[:space:]]*$"

8、添加用户bash、testbash、basher以及nologin(其shell为/sbin/nologin);而后找出/etc/passwd文件中用户名同shell名的行;

grep "^\([[:alnum:]]\+\b\).*\1$" /etc/passwd

9、显示/etc/passwd文件中其默认shell为非/sbin/nologin的用户;

grep -v "/sbin/nologin$" /etc/passwd

10、找出/etc/passwd文件中的一位数或两位数;

grep "\b[0-9]\{1,2\}\b" /etc/passwd

11、显示/boot/grub/grub.conf中以至少一个空白字符开头的行;

grep '^[[:space:]]\+' /boot/grub/grub.conf

11、显示/etc/rc.d/rc.sysinit文件中以#开头,后面跟至少一个空白字符,而后又有至少一个非空白字符的行;

grep "^#\+[[:space:]]\+[^[:space:]]" /etc/rc.d/rc.sysinit

12、打出netstat -tan命令执行结果中以‘LISTEN’,后或跟空白字符结尾的行;

netstat -tan |grep "\bLISTEN[[:space:]]\+$"

14、显示/proc/meminfo文件中以大写或小写S开头的行;用三种方式;

grep -i "^s" /proc/meminfo
grep  "^[sS]" /proc/meminfo
egrep "^(s|S)" /proc/meminfo

16、显示/etc/passwd文件中其默认shell为/bin/bash的用户

grep "/bin/bash$" /etc/passwd | cut -d: -f 1

17、找出/etc/passwd文件中的一位数或两位数;

grep "\b[0-9]\{1,2\}\b" /etc/passwd

扩展正则表达式

字符匹配:

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

次数匹配:

*:匹配前面的字符任意次
?: 匹配前面字符0或1次;
+:匹配前面的字符最少1次;
{m}:匹配前面的字符m次;
{m,n}:匹配前面字符至少m,至多n次;

锚定:

^:一行的开头
$:行的结尾
\<, \b:单词的开始
\>, \b:单词的结束

分组:

():将一个或多个字符捆绑起来,组成一个整体处理
后向引用:\1, \2, ...

或者:

a|b 
C|cat: C或cat

练习题

1、显示/boot/grub/grub.conf中以至少一个空白字符开头的行;

grep -E "[[:space:]]+" /etc/rc.d/rc.sysinit

2、显示/etc/rc.d/rc.sysinit文件中以#开头,后面跟至少一个空白字符,而后又有至少一个非空白字符的行;

grep -E "#+[[:space:]]+[^[:space:]]" /etc/rc.d/rc.sysinit

3、打出netstat -tan命令执行结果中以‘LISTEN’,后或跟空白字符结尾的行;

netstat -tan |grep -E "\bLISTEN[[:space:]]+$"

4、添加用户bash, testbash, basher, nologin (此一个用户的shell为/sbin/nologin),而后找出当前系统上其用户名和默认shell相同的用户的信息;

grep -E "^([[:alnum:]]+\b).*\1$" /etc/passwd

5、显示当前系统上root、fedora或user1用户的默认shell;

grep -E "^(root|fedora|user1)" /etc/passwd | cut -d: -f1,7

6、找出/etc/rc.d/init.d/functions文件中某单词后面跟一组小括号的行,形如:hello();

egrep  "[[:alnum:]]+\(\)" /etc/rc.d/init.d/functions  
在扩展的正则表达式上(),是分组,需要用\进行逃逸。

7、使用echo命令输出一个绝对路径,使用grep取出其基名;

echo "/etc/passwd/" | egrep  -o "[[:alpha:]]+" | tail -n 1

    扩展:取出其路径名

echo "/etc/passwd" | sed 's@[^/]\+/\?$@@'

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

ifconfig |egrep  "\b[1-9][0-9]?\b|\b1[0-9]{2}\b|\b2[0-4][0-9]\b|\b25[0-5]\b"

9、挑战题:写一个模式,能匹配合理的IP地址;

ifconfig |egrep "(\<([0,1]?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])\>\.){3}\<([0,1]?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])\>"

10、挑战题:写一个模式,能匹配出所有的邮件地址;

egrep "[[:alnum:]]+_?[[:alnum:]]+@[[:alnum:]]+\.[[:alpha:]]+\.?[[:alpha:]]+?" abc

原创文章,作者:N21_ Dominic,如若转载,请注明出处:http://www.178linux.com/21933

(0)
N21_ DominicN21_ Dominic
上一篇 2016-07-10
下一篇 2016-07-10

相关推荐

  • 脚本

    1、写一个脚本,判断当前系统上所有用户的shell是否为可登录shell(即用户的shell不是/sbin/nologin);分别这两类用户的个数;通过字符串比较来实现;     #!/bin/bash     #     sum=0 &n…

    Linux干货 2016-12-23
  • haproxy

    12.1 高性能负载均衡软件HAProxy介绍 随着互联网业务的迅猛发展,大型电商平台和门户网站对系统的可用性和可靠性要求越来越高,高可用集群、负载均衡集群成为一种热门的系统架构解决方案。在众多的负载均衡集群解决方案中,有基于硬件的负载均衡设备,例如F5、Big-IP等,也有基于软件的负载均衡产品,例如HAProxy、LVS、Nginx等。在软件的负载均衡产…

    2018-01-03
  • Linux进程与计划任务

    Linux进程与计划任务 linux进程及作业管理 进程 内核的功用:进程管理、文件系统、网络功能、内存管理、驱动程序、安全功能等特权操作模式切换(理想状态):70%CPU时间用户模式+30%CPU时间内核模式进程(Process):是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的存在生命周期的基本单位,是操作系统结构的基础。在早期…

    Linux干货 2016-09-23
  • 推荐-DNS BIND初探

    DNS BIND DNS BIND 正向解析 反向解析 从服务器 子域授权 转发 view DNS 什么是DNS? DNS是domain name system,域名系统的简写,负责实现域名与IP的转换。 DNS的功能是什么? DNS能够将IP地址与域名相互双向转换,能够实现域名访问。 DNS的历史:  1. 初期网络…

    2016-04-19
  • Linux系统中快捷键和man手册讲解

    1、Linux中的man手册   man这个单词的翻译是男人的意思,但在Linux中是我们对于命令的帮助查找,我们知道在Linux中命令有很多,简直浩瀚如海,我们不可能都能理解每个命令的意思。所以,Linux的帮助文件大大解决了我们对于命令的理解性。通过man指令可以查看Linux中的指令帮助、配置文件帮助和编程帮助等信息。 2、语法格式…

    Linux干货 2016-10-17
  • Openssl搭建私有CA认证

    概述 CA英文全称Certification Authority,即数字证书认机构。从广义上来说,CA是负责发放和管理数字证书的权威机构,并作为用户数字认证中受信任的第三方,承担公钥体系(PKI)中公钥的合法性检验的责任,在互联网上,实现用户与用户、用户与企业之间的数字身份认证。 本文通过使用openssl进行搭建私有CA认证体系,从而简单地了解CA的认证过…

    Linux干货 2016-09-22

评论列表(1条)

  • 马哥教育
    马哥教育 2016-07-12 14:43

    写的很好,排版也很棒,图画的也很棒,加油