正则表达式基础知识及应用(用于个人学习以及回顾)

一. 正则表达式概述

正则表达式(Regular Expression)是一种文本模式,包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为"元字符")。

正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串。

总的来说,正则表达式是使用“一串符号”来描述有共同属性的数据。


二. 正则表达式在Linux中使用

Linux中可使用egrep+正则表达式来进行你想要的过滤。

egrep过滤工具

   2.1 文本处理顺序

  • 以行为单位,逐渐进行处理

  • 默认只输出与表达式相匹配的文本行

   2.2 基本用法

  • 格式1:egrep [选项] ‘正则表达式’文件

  • 格式2:前置命令 | egrep [选项] ‘正则表达式’

   2.3 常用命令选项

  • -i : 忽略字母大小写

  • -v: 条件取反

  • -c: 统计匹配的行数

  • -q: 静默、无任何输出,一般用于检测

  • -n: 显示出匹配结果所在的行号

  • --color: 标红显示匹配字串 

三. 使用正则表达式

3.1 正则表达式列表

正则表达式.PNG

3.2 实例

 1)输出以“r”开头的用户记录:

[root@client ~]# grep '^r' /etc/passwd
root:x:0:0:root:/root:/bin/bash
rpc:x:32:32:Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologin
rtkit:x:172:172:RealtimeKit:/proc:/sbin/nologin
radvd:x:75:75:radvd user:/:/sbin/nologin
rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin

2)输出以“nologin”结尾的行:

[root@client ~]# grep 'nologin$' /etc/passwd
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
... ...

3)grep检索式同时组合多个条件,可使用转义字符或者使用扩展正则

  输出以"adm"和“mail”开头的行(使用转义字符“\|”):

[root@client ~]# grep "^adm\|^mail" /etc/passwd
adm:x:3:4:adm:/var/adm:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin

 输出以"adm"和“mail”开头的行(使用拓展正则):

[root@client ~]# grep -E "^adm|^mail" /etc/passwd
adm:x:3:4:adm:/var/adm:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin

4)grep、egrep中-q选项

 选项 -q 表示 quiet(静默)的意思,结合此选项可以只做检索而并不输出,通常在脚本内用来识别查找的目标是否存在,通过返回状态 $? 来判  断,这样可以忽略无关的文本信息,简化脚本输出。

 检查/etc/hosts文件内是否存在127.0.0.1的映射记录,如果存在则显示“YES”,否则输出 “NO”:

[root@client ~]# grep '^127.0.0.1' /etc/hosts && echo "YES" || echo "NO"
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
YES
[root@client ~]# grep -q '^127.0.0.1' /etc/hosts && echo "YES" || echo "NO"
YES

5)基本元字符.---匹配任意单个字符

 以/etc/rc.local文件为例,确认文本内容:

[root@client ~]# cat /etc/rc.local 
#!/bin/bash
# THIS FILE IS ADDED FOR COMPATIBILITY PURPOSES
#
# It is highly advisable to create own systemd services or udev rules
# to run scripts during boot instead of using this file.
#
# In contrast to previous versions due to parallel execution during boot
# this script will NOT be run after all other services.
#
# Please note that you must run 'chmod +x /etc/rc.d/rc.local' to ensure
# that this script will be executed during boot.
touch /var/lock/subsys/local

输出/etc/rc.local文件内至少包括一个字符(\n换行符除外)的行,即非空行:

[root@client ~]# egrep '.' /etc/rc.local
#!/bin/bash
# THIS FILE IS ADDED FOR COMPATIBILITY PURPOSES
#
# It is highly advisable to create own systemd services or udev rules
# to run scripts during boot instead of using this file.
#
# In contrast to previous versions due to parallel execution during boot
# this script will NOT be run after all other services.
#
# Please note that you must run 'chmod +x /etc/rc.d/rc.local' to ensure
# that this script will be executed during boot.
touch /var/lock/subsys/local

输出/etc/rc.local文件内的空行(用 –v 选项将条件取反):

[root@client ~]# egrep -v '.' /etc/rc.local

[root@client ~]#

上述取空行的操作与下列操作效果相同:

[root@client ~]# egrep '^$' /etc/rc.local

[root@client ~]#

6)基本元字符+、?、*  (表示目标的出现次数)

就以/etc/rc.local文件为例:

输出包括 f、ff、ff、……的行,即“f”至少出现一次:

[root@client ~]# egrep 'f+' /etc/rc.local

输出末尾的“d”最多出现一次:

[root@client ~]# egrep 'd?' /etc/rc.local

输出包括stu、stuf、stuff、stufff、……的行,即末尾的“f”可出现任意多次,也可以没有。

[root@client ~]# egrep 'stuf*' /etc/rc.local

输出所有行,单独的“.*”可匹配任意行(包括空行):

[root@client ~]# egrep '.*' /etc/rc.local

7) 元字符{}---限定出现的次数范围

创建一个练习用的测试文件:

[root@client ~]# cat test.txt 
ab def ghi abdr
dedef abab ghighi
abcab njimkol
dfsahghasdfdsa
cdcd ababab
Hello abababab World

输出包括ababab的行,即“ab”连续出现3次:

[root@client ~]# egrep '(ab){3}' test.txt
cdcd ababab
Hello abababab World

输出包括abab、ababab、abababab的行,即“ab”连续出现2~4次:

[root@client ~]# egrep '(ab){2,4}' test.txt
dedef abab ghighi
cdcd ababab
Hello abababab World

输出包括ababab、abababab、……的行,即“ab”最少连续出现3次:

[root@client ~]# egrep '(ab){3,}' test.txt
cdcd ababab
Hello abababab World

8) 元字符[]---匹配范围内的单个字符

还以test.txt为例,母的行,使用[A-Z]匹配连续范围:

[root@client ~]# egrep '[A-Z]' test.txt
Hello abababab World

输出包括abc、abd的行,即前两个字符为“ab”,第三个字符只要是c、d中的一个就符合条件:

[root@client ~]# egrep 'ab[cd]' test.txt
ab def ghi abdr
abcab njimkol

9)匹配mac地址

正则表达式匹配的MAC地址可以写成:

[0-9a-fA-F]{2}:[0-9a-fA-F]{2}:[0-9a-fA-F]{2}:[0-9a-fA-F]{2}:[0-9a-fA-F]{2}:[0-9a-fA-F]{2}

又或者可以这么写:

[0-9a-fA-F]{2}(:[0-9a-fA-F]{2}){5}

10)匹配邮箱地址

电子邮箱地址的特征是“用户名@域名”,主要包括:    

  • 用户名与域名之间以 @ 分隔

  • 用户名不少于3个字符,可能由字母、下划线、句点 . 、数字组成

  • 域名应至少有一个 . 分隔,分隔的各部分至少2个字符,可能由字母、减号、数字组成

正则表达式可以表示为:

[0-9a-zA-Z_.]{3,}@[0-9a-zA-Z.-]{2,}(\.[0-9a-zA-Z-]{2,})+


猜你喜欢

转载自blog.51cto.com/11483827/2363787