正则表达式就是用于匹配每行输入的一种模式,模式是指一串字符序列。拥有强大的字符搜索功能。也非常方便的搜索过滤出我们想要的内容。

linux正则表达式分为基本正则表达式(Basic Regexp)和扩展正则表达式(Extended Regexp)

  linux中,grep,sed,awk都支持正则表达式,这次我们使用grep来演示正则表达式的测试。grep默认仅支持基础正则表达式,如果使用扩展型正则表达式,可以使用grep -E

为了便于观察匹配的值高亮显示,可以给grep命令设置GREP_COLOR的值来指定颜色。
下面是部分颜色的值编号
  30 black
  31 red
  32 green
  33 yellow
  34 blue
  35 purple
  36 cyan
  37 white

[root@localhost tmp]# vim  ~/.bashrc
添加这行
export GREP_OPTIONS='--color=auto' GREP_COLOR=''
[root@localhost tmp]# source ~/.bashrc

正则单字符的表示方式

1.1 单字符分为三种

  特定字符(比如 ' a'  '中')

  范围内字符,用[]表示,它表示单个字符的范围,转指一个字符,比如要搜索包含数字0到9的,就可以[0-9],或者找到123中其中某一个数字[123]。

 grep '[0-9]' passwd
 grep '[a-zA-Z]' passwd

  取反字符

grep '[^a-zA-Z]' passwd

  任意字符( . 来表示)表示匹配任意的字符

 grep . passwd

  

  如果把点放在[]里面就代表本身的意义

  

  加上反义字符 \,效果也是一样,这个反义字符功能就是对点(.) 本身功能的取反。

  

  这三种也可以组合成为一个复杂的正则表达式

   

边界字符:头尾字符

 ^ :  头字符符号,例如:^www  注意与[^www]的区别,这里是代表头字符的意思,是一行以www字符为开头,而不是一个范围取反。

[root@localhost tmp]# grep ^www passwd
www:x::::/home/www:/bin/bash

$:尾字符符号,代表以什么字符为结束的行。

[root@localhost tmp]# grep halt$ passwd
halt:x:::halt:/sbin:/sbin/halt

如果要匹配空行,可以用头字符和尾字符放一起

[root@localhost tmp]# grep ^$ passwd

显示行号可以加n

[root@localhost tmp]# grep -n ^$ passwd
49:

元字符(代表普通字符或特殊字符)

     \w: (小写的w)匹配任何字类字符,包括下划线([A-Za-z0-9_])。

\W:(大写的w)匹配任何非字类字符([^A-Za-z0-9_]),相当于上面\w的取反。

\b:代表单词的分割。

[root@localhost tmp]# grep '\bx\b' passwd
root:x:::root:/root:/bin/bash
bin:x:::bin:/bin:/sbin/nologin
daemon:x:::daemon:/sbin:/sbin/nologin

正则表达式字符组合

匹配一个大写后面跟着一个小写字母的这样字符组合

[root@localhost tmp]# grep '[A-Z][a-z]' /etc/passwd
ftp:x:::FTP User:/var/ftp:/sbin/nologin
nobody:x:::Nobody:/:/sbin/nologin
avahi-autoipd:x:::Avahi IPv4LL Stack:/var/lib/avahi-autoipd:/sbin/nologin
dbus:x:::System message bus:/:/sbin/nologin
polkitd:x:::User for polkitd:/:/sbin/nologin
unbound:x:::Unbound DNS resolver:/etc/unbound:/sbin/nologin

同理试下匹配两位数字。

[root@localhost tmp]# grep '[0-9][0-9]' /etc/passwd
mysql:x::::/home/mysql:/bin/bash
www:x::::/home/www:/bin/bash
nginx:x::::/home/nginx:/bin/bash
rabbitmq:x:9:6:RabbitMQ messaging server:/var/lib/rabbitmq:/bin/bash
songguojun:x::::/home/songguojun:/bin/bash
lang:x::::/home/lang:/bin/bash

结果发现匹配到了所有的挨在一起的两位数,这个也是正则的最大化匹配,所有有时候返回的结果并不是我们想要的。我们可以用到上面用到的分隔符\b。

[root@localhost tmp]# grep '\b[0-9][0-9]\b' /etc/passwd

正则表达式可以匹配重复的字符,

  *:零次或多次匹配前面的字符或子表达式。

+:一次或多次匹配前面的字符或子表达式。

?:零次或一次匹配前面的字符或子表达式。

准备字符串

[root@localhost tmp]# echo -ne " auu \n aeeeeeee\n se \n sdddd \n ooaekkaemma \n"
auu
aeeeeeee
se
sdddd
ooaekkaemmae+
kka

将上面的字符串写入到文件中:

[root@localhost tmp]# echo -ne " auu \n aeeeeeee\n se \n sdddd \n ooaekkaemmae+ \n kka \n aeaekk" > test.txt
[root@localhost tmp]# cat test.txt
auu
aeeeeeee
se
sdddd
ooaekkaemmae+
kka

下面就分别使用 * , + , ? 这个三个元字符来匹配ae字符串。

示例1-1

[root@localhost tmp]#  grep 'ae*' test.txt
auu
aeeeeeee
ooaekkaemmae+
kka

示例1-2

[root@localhost tmp]#  grep 'ae+'  test.txt
ooaekkaemmae+
[root@localhost tmp]# grep 'ae\+' test.txt 这里+要转义下
aeeeeeee
ooaekkaemmae+

示例1-3

[root@localhost tmp]#  grep 'ae\?'  test.txt   这里?也要转义下
auu
aeeeeeee
ooaekkaemmae+
kka

上面是匹配重复的单个字符,那如果想匹配重复的表达式呢?这里我们需要另一个符号()。

示例1-4

[root@localhost tmp]#  grep '\(ae\)*'  test.txt   ()需要转义
auu
aeeeeeee
se
sdddd
ooaekkaemmae+
kka
aeaekk

重复特定的次数{n,m} , n代表重复的最小次数,m代表重复的最大的次数,如果m不写那就是表示重复无限大的次数。

任意字符串表示:.*

[root@localhost tmp]# grep 'n..n' /etc/passwd
nfsnobody:x:::Anonymous NFS User:/var/lib/nfs:/sbin/nologin
gnome-initial-setup:x::::/run/gnome-initial-setup/:/sbin/nologin
nginx:x::::/home/nginx:/bin/bash
[root@localhost tmp]# grep 'n.*n' /etc/passwd
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:::adm:/var/adm:/sbin/nologin
lp:x:::lp:/var/spool/lpd:/sbin/nologin
[root@localhost tmp]# grep '\bn.*n\b' /etc/passwd
bin:x:::bin:/bin:/sbin/nologin
daemon:x:::daemon:/sbin:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin 正则的贪婪匹配

就不要让匹配任意字符,缩小匹配范围。

[root@localhost tmp]# grep '\bn[a-z]*n\b' /etc/passwd
bin:x:::bin:/bin:/sbin/nologin
daemon:x:::daemon:/sbin:/sbin/nologin
nobody:x:::Nobody:/:/sbin/nologin

正则表达式逻辑字符组合

     逻辑的表示:

| : ' /bin\(false\|true\)'    两种可能性都存在的情况,注意括号和逻辑或 | 符号 要加上反斜线。

[root@localhost tmp]# grep 'bin/\(bash\|nologin\)' /etc/passwd
root:x:::root:/root:/bin/bash
bin:x:::bin:/bin:/sbin/nologin
daemon:x:::daemon:/sbin:/sbin/nologin
adm:x:::adm:/var/adm:/sbin/nologin
mysql:x::::/home/mysql:/bin/bash
www:x::::/home/www:/bin/bash

下面在看几个案例

匹配4-9位qq号

[root@localhost tmp]# grep '^[0-9]\{4,10\}$'  test.txt

匹配15位或者18位可以包含末尾是x的身份证

[root@localhost tmp]# echo  |  grep '^[1-9]\([1-9]\{13\}\|[0-9]\{16\}\)[0-9xX]$'

匹配密码(包含数字,26个字母和下划线组成)

[root@localhost tmp]# echo abc_6388 |  grep '^\w\+$'
abc_6388

 正则表达式总结图

linux通配符


通配符是指一些特殊符号,可以用来模糊搜索文件,这些字符包括“?”,“*”,“[]”,{}。

[root@localhost etc]# ls *.conf
asound.conf cgconfig.conf colord.conf extlinux.conf host.conf krb5.conf libuser.conf mke2fs.conf ntp.conf
autofs.conf cgrules.conf dnsmasq.conf fprintd.conf idmapd.conf ksmtuned.conf locale.conf
[root@localhost data]# ls -l /usr/lib*/libm.so*
lrwxrwxrwx. root root 6月 /usr/lib64/libm.so -> ../../lib64/libm.so.6
lrwxrwxrwx. root root 6月 /usr/lib64/libm.so. -> libm-2.17.so
lrwxrwxrwx. root root 6月 /usr/lib/libm.so -> ../../lib/libm.so.6
lrwxrwxrwx. root root 6月 /usr/lib/libm.so. -> libm-2.17.so
[root@spark78- kyhome]# ls *.gif;ls *.png
.gif .gif .gif .gif .gif
.png15194575459612727704.gif .gif .gif .gif
.gif .gif
.png

[^0-9] !^表示非,取反

[root@spark78- kyhome]# touch abc.png
[root@spark78- kyhome]# ls [^-]*.png
abc.png
[root@spark78- kyhome]# ls [!-]*.png
abc.png

? 任何一个字符

[root@localhost etc]# ls ???
rpc gdm:
custom.conf Init PostLogin PostSession PreSession Xsession gss:
mech mech.d
符号 作用
* 匹配任何字符串/文本,包括空字符串;*代表任意字符(0个或多个) ls file *
? 匹配任何一个字符(不在括号内时)?代表任意1个字符 ls file 0
[abcd] 匹配abcd中任何一个字符
[a-z] 表示范围a到z,表示范围的意思 []匹配中括号中任意一个字符 ls file 0
{..} 表示生成序列. 以逗号分隔,且不能有空格
补充  
[!abcd] 或[^abcd]表示非,表示不匹配括号里面的任何一个字符

【Linux】linux正则表达式及通配符的更多相关文章

  1. linux 正则表达式和通配符

    linux 正则表达式和通配符 通配符用于查找文件 包含三种:  * ? [] * 代表任意个任意字符 ? 代表任意一个字符 [] 代表中括号中的一个字符 正则表达式(正则是包含匹配,只要包含就可以匹 ...

  2. Linux正则表达式与通配符

    在linux中,有通配符和正则表达式,这是两个不同的概念通配符:它是由shell解析,并且一般用于匹配文件名.如:ls正则表达式:是一个字符匹配标准,可以匹配文本中的内容一些命令工具按此标准实现字符匹 ...

  3. linux shell 正则表达式(BREs,EREs,PREs)差异比较

    linux shell 正则表达式(BREs,EREs,PREs)差异比较 则表达式:在计算机科学中,是指一个用来描述或者匹配一系列符合某个句法规则的字符 串的单个字符串.在很多文本编辑器或其他工具里 ...

  4. 07: linux中正则表达式与grep使用

    1.1 linux中正则表达式 1.^linux        以linux开头的行 2.$php         以php结尾的行 3..                匹配任意单字符 4..+  ...

  5. linux shell 正则表达式(BREs,EREs,PREs)的比较

    原文 :   linux shell 正则表达式(BREs,EREs,PREs)差异比较 在使用 linux shell的实用程序,如awk,grep,sed等,正则表达式必不可少,他们的区别是什么 ...

  6. Linux之正则表达式

    正则表达式与通配符的区别: 最常应用正则表达式的命令是grep(egrep),sed,awk. 正则表达式和通配符有本质区别,正则表达式用来找:[文件]内容,文本,字符串.一般只有三剑客支持.通配符用 ...

  7. Linux学习 - 正则表达式

    一.正则表达式与通配符 正则表达式:在文件中匹配符合条件的字符串,正则是包含匹配 通配符:用来匹配符合条件的文件名,通配符是完全匹配 二.基础正则表达式 元字符 作用 a* a有0个或任意多个 . 除 ...

  8. [Linux]Linux下安装和配置solr/tomcat/IK分词器 详细实例二.

    为了更好的排版, 所以将IK分词器的安装重启了一篇博文,  大家可以接上solr的安装一同查看.[Linux]Linux下安装和配置solr/tomcat/IK分词器 详细实例一: http://ww ...

  9. [Linux]Linux下redis的安装及配置.

    在上一篇[Linux] linux下安装配置 zookeeper/redis/solr/tomcat/IK分词器 详细实例. 我们已经将redis所需tar包拷贝到了linux下的root 根目录下, ...

  10. [Shell]正则表达式与通配符

    ----------------------------------------------------------------------------------------- 正则表达式与通配符: ...

随机推荐

  1. 测试工具之ab

    ab命令原理  Apache的ab命令模拟多线程并发请求,测试服务器负载压力,也可以测试nginx.lighthttp.IIS等其它Web服务器的压力.  ab命令对发出负载的计算机要求很低,既不会占 ...

  2. PHP之CLI模式

    转载: http://www.cnblogs.com/zcy_soft/archive/2011/12/10/2283437.html 所有的PHP发行版,不论是编译自源代码的版本还是预创建的版本,都 ...

  3. VS如何在调试时进入到dll文件

    背景:    项目A:用C#写的一个类库文件 项目B:引用项目A的dll文件,完成编码,也是C#编写的. 需求:怎么能在调试的时候,调试断点能够从项目B中进入项目A中的代码. 解决办法就是: 假设,项 ...

  4. java的数据类型:基本数据类型和引用数据类型

    Java数据类型的基本概念 数据类型在计算机语言里面,是对内存位置的一个抽象表达方式,可以理解为针对内存的一种抽象的表达方式. 开始接触每种语言的时候,都会存在对数据类型的认识,有复杂的,有复杂的,各 ...

  5. Java 基本数据类型 及 == 与 equals 方法的区别

    Java数据类型分为基本数据类型与引用数据类型. 1 基本数据类型 byte:Java中最小的数据类型,在内存中占1个字节(8 bit),取值范围-128~127,默认值0 short:短整型,2个字 ...

  6. SQL查询临时表空间的数据

  7. ConnectTimeout和ReadTimeout所代表的意义

    参考:ConnectTimeout和ReadTimeout所代表的意义 ConnectTimeout 指的是建立连接所用的时间,适用于网络状况正常的情况下,两端连接所用的时间. 在java中,网络状况 ...

  8. Unable to resolve target 'android-15'

    SDK 15没有加载造成的,在SDK Manager.exe下安装以下文件 Android SDK Tools (25.2.5) Android SDK Platform-tools (28.0.1) ...

  9. July 算法习题 - 字符串4(全排列和全组合)

    https://segmentfault.com/a/1190000002710424 思想:当前层各节点首元素不同,则各节点的剩余元素也不同:下一层节点交换范围为首元素以外的元素 全排列算法: vo ...

  10. 用于Azure功能的Visual Studio 2017工具

    今天我们很高兴地宣布发布第一个预览的Visual Studio 2017工具的Azure功能.这个预览介绍了一些令人兴奋的变化,我们以前的版本.此外,除了支持Visual Studio 2017之外, ...