简单说:
正则表达式就是为了处理大量的文本文件,字符串而定义的一套规则和方法
以行为单位,一次处理一行
Linux运维工作,大量过滤日志工作 化繁为简
简单,高效,易用
正则表达式高级工具 Linux三剑客都支持
注意:
正则表达式用来找:文件内容 文本 字符串 三剑客都支持
通配符用来找文件名,文件 普通命令都支持
BRE(基础正则表达式)只承认的元字符有 ^ $ . [ ] *其它字符识别为普通字符。
ERE(扩展正则表达式)则添加了() {} ?+ | 等
只有在用反斜杠“\”进行转义的情况下,字符() { } 才会在BRE被当做元字符处理,而在ERE中,任何元字符号前面加上反斜杠反而会使其被当做普通字符来处理
符号 | 描述 |
^ 尖角号 | 查找以什么开头的文件 例子: 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。表示取反 例子: [root@oldboyedu]# grep ‘[^a-z]‘ file.txt |
. | “.”匹配且只能匹配任意一个字符(不匹配空行) 例子: grep "5.1" text.txt 531 表示匹配5和1中间任意一个字符 grep "23." text.txt 234 342342 匹配23后面任意一个字符 [root@oldboyedu]# 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 注意:*号与不加*号的区别 例子:加*号 [root@oldboyedu ]# grep -o "3*" text.txt 3 333333 333 3333 33 注意:加*号表示连续匹配前一个字符0次到多次,*号有个贪婪性,它会尽可能多的匹配 例子:不加*号 [root@oldboyedu]# grep -o "3" text.txt 3 3 3 3 3 3 3 3 3 注意:不加*号表示只能一个一个的匹配,不会连续的匹配 |
正则符号的贪婪性 | 正则中的*号和+号会有个贪婪性,它们会尽可能多的来匹配文件中的内容,匹配的越多越好,直到没有匹配的内容为止 例子: [root@oldboyedu]# grep -o "3*" text.txt 3 3 3 3 3 333333 333 3333 33 [root@oldboyedu]# 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 例子: [root@oldboyedu]# 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可去掉斜线 例子: [root@oldboyedu]# grep "6\{2,\}" text.txt 5666.6,33 匹配数字6至少两次 |
a\{m\} | 重复前面字符m次,如果用egrep或sed –r可去掉斜线 例子: [root@oldboyedu]# egrep --color=auto "6{3}" text.txt 5666.6,33 只匹配数字6三次 |
a\{,m\} | 重复前面的字符最多m次,如果用egrep或sed –r可去掉斜线 例子: [root@oldboyedu]# grep "6\{,3\}" text.txt 23333..33,445565 5666.6,33 匹配数字6最多3次 |
查找text.txt文件中以u开头到l的匹配行
解答:
[root@oldboyedu]# grep "^u.*l"text.txt
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
符号 | 描述 |
+ | 匹配1次或多次连续的字符 例子: egrep -o "[a-z]+" text.txt root x root root bin bash bin 取出text.txt文件中所有的单词 例子: [root@oldboyedu]# egrep -o "6+" text.txt 6 6 6666 |
| | 或者,同时过滤多个字符 例子: egrep "is|am" my.txt [root@oldboyedu]# egrep -o "am|is" my.txt am is -o只显示匹配到的内容 例子: [root@oldboyedu]# dumpe2fs /dev/sda3|egrep -i "inode size|block size" dumpe2fs 1.41.12 (17-May-2010) Block size: 4096 Inode size: 256 例子: [root@oldboyedu]# dumpe2fs /dev/sda3|egrep -i "inode count|^block count" dumpe2fs 1.41.12 (17-May-2010) Inode count: 462384 Block count: 1849088 |
() | 小括号的中的内容为一个整体 例如: [root@oldboyedu]# egrep "oldb(o|e)y" oldboy.sh oldboy oldbey |
? | 重复前一个字符出现0次或1次 |
[::alnum] : 数字字符 | [:digit:] : 数字字符 | [:punct:] : 标点符号字符 |
[:alpha:] : 字母字符 | [:graph:] : 非空格字符 | [:space:] : 空格字符 |
[:blank:] : 空格与定位字符 | [:lower:] : 小写字母字符 | [:upper:] : 大写字母字符 |
[:cntrl:] : 控制字符 | [:print:] : 可显示的字符 | [:xdigit:] : 16进制数字 |
本文出自 “每天一小步” 博客,请务必保留此出处http://fenyuer.blog.51cto.com/11265169/1931773
原文地址:http://fenyuer.blog.51cto.com/11265169/1931773