Linux正则表达式
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux正则表达式相关的知识,希望对你有一定的参考价值。
正则表达式
1、什么是正则表达式
1.1、正则表达式就是为了处理大量的文件文本字符串而定义的一套规则和方法
1.2、通过定义的这些特殊符号的辅助,系统管理员就可以快速过滤,替换或输出需要的字符串
1.3、Linux正则表达式一般以行为单位处理
简单说:
正则表达式就是为了处理大量的文本文件,字符串而定义的一套规则和方法
以行为单位,一次处理一行
2、为何使用正则表达式:
Linux运维工作,大量过滤日志工作 化繁为简
简单,高效,易用
正则表达式高级工具 Linux三剑客都支持
注意:
正则表达式用来找:文件内容 文本 字符串 三剑客都支持
通配符用来找文件名,文件 普通命令都支持
3、BRE和ERE的区别仅仅是元字符的不同:
BRE(基础正则表达式)只承认的元字符有 ^ $ . [ ] *其它字符识别为普通字符。
ERE(扩展正则表达式)则添加了() {} ?+ | 等
只有在用反斜杠“\”进行转义的情况下,字符() { } 才会在BRE被当做元字符处理,而在ERE中,任何元字符号前面加上反斜杠反而会使其被当做普通字符来处理
4、基础正则表达式(BRE)
符号 | 描述 |
^ 尖角号 | 查找以什么开头的文件 例子: grep "^r" text.txt 表示以r开头行 |
$ | 查找以什么结尾的文件 例子: grep "h$" text.txt 表示以h结尾的行 |
^$ | 取空行 例子: grep "^$" text.txt 取text.txt的空行 取text.txt文件中的空行 |
\ | 转义符,用来屏蔽一个特殊字符的特殊含义 失去了一个字符的本身含义 例子: grep "\!$" text.txt lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin! 取以!号结尾的行,不加转义符不行,而不是取反 \n 匹配一个换行符 \r 匹配回车 \t 匹配一个横向制表符 tab |
[abc] | 匹配[abc]内字符,可以是一个单字符,也可以是字符序列。可以使用 - 表示[]内字符序列范围,如用[1-5]代替[12345] [abc]表示取中括号内的a或者b或者c,而不是abc整体 例子: grep "[1-3]" text.txt 查找包含1-3的行 |
[^1-3] | 不包含^后的任意字符,1或2或3。表示取反 例子: [[email protected]]# grep ‘[^a-z]‘ file.txt |
. | “.”匹配且只能匹配任意一个字符(不匹配空行) 例子: grep "5.1" text.txt 531 表示匹配5和1中间任意一个字符 grep "23." text.txt 234 342342 匹配23后面任意一个字符 [[email protected]]# grep "." file1.txt fgsdgsdfdsmldsmgdls,,,,;sdkgsdwww.qq.comgel ewgmewlgmewgwelgewww.qq.com gsgewgewgeomomodsgmegipweigtepvsnvdvd dfjwwewww.qq.com rewrwero39r309,.;l‘121‘l‘..www.qq.com erjeowew.emglwewetwewww.qq.com 35325325230www.qq.com “.”匹配任意一个字符,所以匹配到了全部并且打印出来了, |
* | 匹配0次或多次 重复前一个字符0次或多次的字符 重复、连续0次的时候,表示什么也没有(空),匹配出文件所有内容 例如: grep "333*" text.txt 2333333445565 5666633 注意:*号与不加*号的区别 例子:加*号 [[email protected] ]# grep -o "3*" text.txt 3 333333 333 3333 33 注意:加*号表示连续匹配前一个字符0次到多次,*号有个贪婪性,它会尽可能多的匹配 例子:不加*号 [[email protected]]# grep -o "3" text.txt 3 3 3 3 3 3 3 3 3 注意:不加*号表示只能一个一个的匹配,不会连续的匹配 |
正则符号的贪婪性 | 正则中的*号和+号会有个贪婪性,它们会尽可能多的来匹配文件中的内容,匹配的越多越好,直到没有匹配的内容为止 例子: [[email protected]]# grep -o "3*" text.txt 3 3 3 3 3 333333 333 3333 33 [[email protected]]# egrep -o "3+" text.txt +号属于扩展正则中的符号 3 3 3 3 3 333333 333 3333 33 +匹配前一个连续的字符1次到多次 |
基础正则的命令(grep)如何支持高级正则(扩展正则) | |
a\{m,n\} | 重复前面一个字符m到n次,如果用egrep或sed –r可去掉斜线 重复前面一个字符m次到n次 例子: grep "6\{1,2\}" /oldboy/text.txt 例子2: egrep --color=auto "3{1,3}" /oldboy/text.txt 23333..33,445565 例子: [[email protected]]# egrep --color=auto -o "3{1,3}" /oldboy/text.txt 3 3 3 3 3 333 333 333 333 匹配3最少1次,最多三次 |
a\{m,\} | 重复前面字符至少m次,如果用egrep或sed –r可去掉斜线 例子: [[email protected]]# grep "6\{2,\}" text.txt 5666.6,33 匹配数字6至少两次 |
a\{m\} | 重复前面字符m次,如果用egrep或sed –r可去掉斜线 例子: [[email protected]]# egrep --color=auto "6{3}" text.txt 5666.6,33 只匹配数字6三次 |
a\{,m\} | 重复前面的字符最多m次,如果用egrep或sed –r可去掉斜线 例子: [[email protected]]# grep "6\{,3\}" text.txt 23333..33,445565 5666.6,33 匹配数字6最多3次 |
4.1实例:
查找text.txt文件中以u开头到l的匹配行
解答:
[[email protected]]# grep "^u.*l"text.txt
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
5、扩展正则表达式(ERE)
符号 | 描述 |
+ | 匹配1次或多次连续的字符 例子: egrep -o "[a-z]+" text.txt root x root root bin bash bin 取出text.txt文件中所有的单词 例子: [[email protected]]# egrep -o "6+" text.txt 6 6 6666 |
| | 或者,同时过滤多个字符 例子: egrep "is|am" my.txt [[email protected]]# egrep -o "am|is" my.txt am is -o只显示匹配到的内容 例子: [[email protected]]# dumpe2fs /dev/sda3|egrep -i "inode size|block size" dumpe2fs 1.41.12 (17-May-2010) Block size: 4096 Inode size: 256 例子: [[email protected]]# dumpe2fs /dev/sda3|egrep -i "inode count|^block count" dumpe2fs 1.41.12 (17-May-2010) Inode count: 462384 Block count: 1849088 |
() | 小括号的中的内容为一个整体 例如: [[email protected]]# egrep "oldb(o|e)y" oldboy.sh oldboy oldbey |
? | 重复前一个字符出现0次或1次 |
6、标识字符集,有如下几种:
[::alnum] : 数字字符 | [:digit:] : 数字字符 | [:punct:] : 标点符号字符 |
[:alpha:] : 字母字符 | [:graph:] : 非空格字符 | [:space:] : 空格字符 |
[:blank:] : 空格与定位字符 | [:lower:] : 小写字母字符 | [:upper:] : 大写字母字符 |
[:cntrl:] : 控制字符 | [:print:] : 可显示的字符 | [:xdigit:] : 16进制数字 |
本文出自 “每天一小步” 博客,请务必保留此出处http://fenyuer.blog.51cto.com/11265169/1931773
以上是关于Linux正则表达式的主要内容,如果未能解决你的问题,请参考以下文章