python 正则表达式

来源:互联网 发布:北京外企和fdi数据 编辑:程序博客网 时间:2024/06/02 01:44

http://www.jb51.net/article/54961.htm

这篇文章主要介绍了Shell正则表达式之grep、sed、awk实操笔记,本文使用grep、sed、awk配合正则达到了一些需求和目的,需要的朋友可以参考下最近一直在研究shell脚本这块,刚好闲下来整了下自己手头上比较好的资料中的一些范例,以下是我整理的鸟哥私房菜里面正则表达式里面比较基础的一些语法详解,适合新手查阅。首先先复制一段范例:复制代码 代码如下:# vi regular_express.txt-------------------------------"Open Source" is a good mechanism to develop programs.apple is my favorite food.Football game is not use feet only.this dress doesn't fit me.However, this dress is about $ 3183 dollars.GNU is free air not free beer.Her hair is very beauty.I can't finish the test.Oh! The soup taste good.motorcycle is cheap than car.This window is clear.the symbol '*' is represented as start.Oh!My god!The gd software is a library for drafting programs.You are the best is mean you are the no. 1.The world <Happy> is the same with "glad".I like dog.google is the best tools for search keyword.goooooogle yes!go! go! Let's go.# I am VBird--------------------------------设置语系为C复制代码 代码如下:#export LANG=Cgrep1.搜寻特定字符串"the"注: n为显示行号复制代码 代码如下:# grep -n 'the' regular_express.txt2.反向搜寻特定字符串"the"复制代码 代码如下:# grep -vn 'the' regular_express.txt3.取得任意大小写"the"的这个字符串复制代码 代码如下:# grep -in 'the' regular_express.txt4.利用括号 [] 来搜寻集合字符搜索test或taste这两个单词时,发现他们有共同的't?st',所以可以这么搜寻复制代码 代码如下:# grep -n 't[ae]st' regular_express.txt这样其实就是在找t[a]st和t[e]st这两个分开的字符如果搜索有 oo 的字符时,则可以使用:复制代码 代码如下:# grep -n 'oo' regular_express.txt如果搜索oo时不想搜到 oo 前面有 g 的话,我们可以利用反向选择[^]来达成:复制代码 代码如下:# grep -n '[^g]oo'  regular_express.txt如果搜索oo前面不想有小写字符,则:复制代码 代码如下:# grep -n '[^a-z]oo' regular_express.txt注: 大写英文/小写英文/数字 可以使用 [a-z]/[A-Z]/[0-9]等方式来书写,也可以写在一起[a-zA-Z0-9]表示要求字符串是数字以及英文如果我们要取得有数字的那行,则:复制代码 代码如下:# grep -n '[0-9]' regular_express.txt注:但考虑到语系对编码顺序的影响,因此除了连续编码使用减号[-]外,也可以用[:lower:]代替a-z 以及 [:digit:] 代替0-9 使用复制代码 代码如下:# grep -n '[^[:lower:]]oo' regular_express.txt# grep -n '[[:digit:]]' regular_express.txt5.显示行首为'the'的字符串复制代码 代码如下:# grep -n '^the' regular_express.txt显示行首是小写字符复制代码 代码如下:# grep -n '^[a-z]' regular_express.txt6.显示行尾为点 . 的那一行复制代码 代码如下:# grep -n '\.$' regular_express.txt7.显示5-9行数据复制代码 代码如下:# cat -An regular_express.txt |head -n 10 |tail -n 68.显示空白行复制代码 代码如下:# grep -n '^$' regular_express.txt9.找出g??d字符串,起头g结束d的四个字符串复制代码 代码如下:# grep -n 'g..d' regular_express.txt10. o*代表空字符(就是有没有字符都可以)或者一个到N个o字符,所以grep -n 'o*' regular_express.txt就会把所有行全部打印出来,11.oo*代表o+空字符或者一个到N个o字符,所以grep -n 'oo*' regular_express.txt就会把o,oo,ooo等的行全部打印出来12."goo*g"代表gog,goog,gooog...等复制代码 代码如下:# grep -n 'goo*g' regular_express.txt13.找出含g...g字符串的行注: .代表任意字符, .*则就代表空字符或者一个到N个任意字符复制代码 代码如下:# grep -n 'g.*g' regular_express.txt14.找出含有数字的行复制代码 代码如下:# grep -n '[0-9][0-9]*' regular_express.txt或# grep -n '[0-9]' regular_express.txt15.找出含两个o的字符串注:{}因为在shell里有特殊意义,所以需要加跳脱符\来让其失去意义复制代码 代码如下:# grep -n 'o\{2\}'  regular_express.txt找出g后含2到5个o然后以g结尾的字符串复制代码 代码如下:# grep -n 'go\{2,5\}g'  regular_express.txt找出g后含2以上的o然后以g结尾的字符串复制代码 代码如下:# grep -n 'go\{2,\}g'  regular_express.txt总结:^word     表示带搜寻的字符串(word)在行首word$     表示带搜寻的字符串(word)在行尾.         表示1个任意字符\         表示转义字符,在特殊字符前加\会将原本的特殊字符意义去除*         表示重复0到无穷多个前一个RE(正则表达式)字符[list]    表示搜索含有list的字符串[n1-n2]   表示搜索指定的字符串范围,例如[0-9] [a-z] [A-Z]等[^list]   表示反向字符串的范围,例如[0-9]表示非数字字符,[A-Z]表示非大写字符范围\{n,m\}   表示找出n到m个前一个RE字符\{n,\}    表示n个以上的前一个RE字符egrep总结:+    表示重复一个或一个以上的前一个RE字符范例:egrep 'go+d' regular_express.txt表示搜寻(god)(good)(goood)...等等字符串,o+代表[一个以上的o]?    表示重复零个或一个的前一个RE字符范例:egrep 'go?d' regular_express.txt表示搜寻(gd)(god)字符串,o?代表[空的或1个o]注:egrep下'go+d'和'go?d'的结果集合就等于grep下的'go*d'|    表示用或(or)的方式找出数个字符串范例:egrep 'gd|good|dog' regular_express.txt表示搜寻(gd)或(god)或(god)字符串,|代表或()    表示找出群组字符串范例:egrep 'g(la|oo)d' regular_express.txt表示搜寻(glad)或(good)字符串()    +表示找出多个重复群组的判别范例: echo 'AxyzxyzxyzxyzxyzC'|egrep 'A(xyz)+C'表示搜寻开头是A结尾是C,中间有一个以上的'xyz'字符串sed:插入:1.将/etc/passwd 的内容列出并打印行号,同时,将2-5行删除显示复制代码 代码如下:# nl /etc/passwd | sed '2,5d'注: sed是sed -e的简写, 后接单引号同上删除第2行复制代码 代码如下:# nl /etc/passwd | sed '2d'同上删除第三行到最后一行复制代码 代码如下:# nl /etc/passwd | sed '3,$d'2.在第二行后加上一行test复制代码 代码如下:# nl /etc/passwd | sed '2a test'在第二行前加上一行test复制代码 代码如下:# nl /etc/passwd | sed '2i test'在第二行后加入两行test复制代码 代码如下:# nl /etc/passwd | sed '2a test \> test'替换行:3.将2-5行内容取代为 No 2-5 number复制代码 代码如下:# nl /etc/passwd | sed '2,5c No 2-5 number'4 列出/etc/passwd 内第5-7行复制代码 代码如下:# nl /etc/passwd |sed -n '5,7p'替换字符串:sed 's/被替换字符串/新字符串/g'1.获取本机IP的行复制代码 代码如下:# /sbin/ifconfig eth0 |grep 'inet addr'将IP前面的部分予以删除复制代码 代码如下:# /sbin/ifconfig eth0 |grep 'inet addr'| sed 's/^.*addr://g'将IP后面的部分删除复制代码 代码如下:# /sbin/ifconfig eth0 |grep 'inet addr'| sed 's/^.*addr://g'| sed 's/Bcast:.*$//g'-------------------192.168.100.74-------------------2.用grep将关键词MAN所在行取出来复制代码 代码如下:# cat /etc/man.config |grep 'MAN'删除批注行复制代码 代码如下:# cat /etc/man.config |grep 'MAN'| sed 's/^#.*$//g'删除空白行复制代码 代码如下:# cat /etc/man.config |grep 'MAN'| sed 's/^#.*$//g'| sed '/^$/d'3.利用sed将regular_express.txt内每一行若为.的换成!注:-i参数会直接修改文本,而并非直接输出复制代码 代码如下:# sed -i 's/.*\.$/\!/g' regular_express.txt4.利用sed在文本最后一行加入 #This is a test注: $代表最后一行 a代表行后添加复制代码 代码如下:# sed -i '$a #This is a test' regular_express.txt将selinux配置文件enforcing改成disabled复制代码 代码如下:# sed -i '6,6c SELINUX=disabled' /etc/selinux/config延伸正规表示法:复制代码 代码如下:# grep -v '^$' regular_express.txt |grep -v '^#'延伸写法:复制代码 代码如下:# egrep -v '^$'|'^#' regular_express.txt1. +表示重复一个或一个以上的前一个RE字符例如:egrep -n 'go+d' regular_express.txt普通写法: grep -n 'goo*d' regular_express.txt2. ?表示重复零个或一个前一个RE字符例如: egrep -n 'go?d' regular_express.txt3. |表示用或的方式找出数个字符串例如: egrep -n 'gd|good' regular_express.txt4. ()表示找出群组字符串例如: egrep -n 'g(la|oo)d' regular_express.txt也就是搜寻(glad)或good这两个字符串5. ()+多个重复群组判别例如: echo 'AxyzxyzxyzxyzC'|egrep 'A(xyz)+C'也就是要找开头是A结尾是C 中间有一个以上的'xyz'字符串的意思awk:1.用last取出登陆数据前五行复制代码 代码如下:# last -n 5取出账号与登陆者IP,且账号与IP之间以TAB隔开复制代码 代码如下:# last -n 5 |awk '{print $1 "\t" $3}'注:$1代表用空格或TAB隔开的第一个字段,以此类推。。  $0代表该行全部字段复制代码 代码如下:# last -n 5 |awk '{print $1 "\t lines:" NR "\t columes:" NF}'注: NF代表每一行的$0的字段总数   NR代表目前awk所处的是第几行数据   FS代表目标分隔符,默认为空格2.在/etc/passwd中以:来作为分段字符,则我们要查阅第三栏小于10以下的数据,并只列出账号与第三栏复制代码 代码如下:# cat /etc/passwd | awk '{FS=":"} $3<10 {print $1 "\t \t"$3}'注:查询结果未显示第一行数据,是因为我们虽然定义了FS=":" 但却只能在第二行生效想读取第一行就需要BEGIN这个关键词:复制代码 代码如下:# cat /etc/passwd | awk 'BEGIN {FS=":"} $3<10 {print $1 "\t \t"$3}'df:比较两个文件的差异:复制代码 代码如下:# diff /etc/rc3.d/ /etc/rc5.d/-------------------Only in /etc/rc3.d/: K30spice-vdagentdOnly in /etc/rc5.d/: S70spice-vdagentd-------------------实例:1。统计TCP连接状态复制代码 代码如下:# netstat -na | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'/^tcp/过滤出以tcp开头的行,“^”为正则表达式用法,以...开头,这里是过滤出以tcp开头的行。S[]定义了一个名叫S的数组,在awk中,数组下标通常从 1 开始,而不是 0。NF当前记录里域个数,默认以空格分隔,如上所示的记录,NF域个数等于$NF表示一行的最后一个域的值,如上所示的记录,$NF也就是$6,表示第6个字段的值,也就是SYN_RECV或TIME_WAIT等。S[$NF]表示数组元素的值,如上所示的记录,就是S[TIME_WAIT]状态的连接数++S[$NF]表示把某个数加一,如上所示的记录,就是把S[TIME_WAIT]状态的连接数加一结果就是显示S数组中最终的数组值例:S[TIME_WAIT]=最终值 S[TESTABLISHED]=最终值ENDfor(key in S)遍历S[]数组print key,”\t”,S[key]打印数组的键和值,中间用\t制表符分割,显示好一些。PS:关于正则,本站还提供了2款非常简便实用的正则表达式在线工具供大家参考使用:JavaScript正则表达式在线测试工具:http://tools.jb51.net/regex/javascript正则表达式在线生成工具:http://tools.jb51.net/regex/create_reg您可能感兴趣的文章:一天一个shell命令 linux文本内容操作系列-grep命令详解shell grep 查找进程的小技巧详解 Shell中的grep命令
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 物流信息和和收货地址不一样怎么办 小孩手被电梯门夹了怎么办 车管所50选一没看中的号码怎么办 长沙芙蓉区电动车被交警扣了怎么办 驾照正在考的时候住址变了怎么办 身份证到期了驾驶证上的号码怎么办 小车占道跟大车刮交警怎么办 邻居把消防栓的位置占用了怎么办 查环保要停业整改一个月怎么办 抽油烟机管道公共排烟道漏烟怎么办 深圳龙华电动车被交警扣了怎么办 英国平邮寄到中国丢件怎么办 安卓app与设备不兼容怎么办 手机卡坏了收不到快递短信怎么办 pph手术后钛钉没有脱落怎么办 右侧附件囊状透明声可怎么办 刚刚出生小孩睾丸没有掉下来怎么办 汽车被依非法营运之由扣押怎么办 老婆结婚小孩两个又上夜场该怎么办 对于不断无理要求赔偿的房东怎么办 欠的钱越来越多不知道怎么办了 手机壳的开机按键不好按怎么办 对方把保权的房子卖给我怎么办 内存卡在手机上显示损坏怎么办 内存卡显示但是下载不了东西怎么办 相机sd卡没办法读卡怎么办 尼康相机新sd卡显示满了怎么办 修冰箱没几个月又坏了怎么办 星露谷物语活动中心成了仓库怎么办 你家如果油锅起火时应该怎么办 当你遇到电器起火时应该怎么办 酷派大神f2充不进去电怎么办 借车子别人开违章一年了怎么办 快递刚发货我点错了收货怎么办 快递收货地址错了已经发货了怎么办 老公在外地工地上夜班吃不好怎么办 工人在工地干活被吊车撞了怎么办 小米手机记不得保密柜密码怎么办 华为手机文件保密柜密码忘了怎么办 超市寄存柜密码纸丢了怎么办 佳明软件安装不到手机上怎么办