一. 正则表达式概述
正则表达式(Regular Expression)是一种文本模式,包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为"元字符")。
正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串。
总的来说,正则表达式是使用“一串符号”来描述有共同属性的数据。
二. 正则表达式在Linux中使用
Linux中可使用egrep+正则表达式来进行你想要的过滤。
egrep过滤工具
2.1 文本处理顺序
以行为单位,逐渐进行处理
默认只输出与表达式相匹配的文本行
扫描二维码关注公众号,回复: 5546784 查看本文章
2.2 基本用法
格式1:egrep [选项] ‘正则表达式’文件
格式2:前置命令 | egrep [选项] ‘正则表达式’
2.3 常用命令选项
-i : 忽略字母大小写
-v: 条件取反
-c: 统计匹配的行数
-q: 静默、无任何输出,一般用于检测
-n: 显示出匹配结果所在的行号
--color: 标红显示匹配字串
三. 使用正则表达式
3.1 正则表达式列表
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,})+