【学神】 1-20正则表达式以及sed、awk的使用
一、正则表达式概念正则表达式,又称正规表示法、常规表示法(英语:RegularExpression,在代码中常简写为regex、regexp或RE),计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。 是指一个用来描述或者匹配一系列符合某个句法规则的字符的那个字符串。 用某种模式去匹配一类字符串。 1.格式使用grep -v不匹配 -n显示行号 【例】 [root@xuegod63tmp]#grep-n'w[oa]rld'a.txt#查看a.txt中包含world或warld的行并显示行号 [root@xuegod63tmp]#grep-v"<!--"b.xml#查看b.xml不包含注释的部分 2.正则表达式中特殊字符
1)^word:待搜寻的字符串(word)在行首 搜寻“root”开始的行: 【例】 [root@xuegod63tmp]#grep^rootpasswd root:x:0:0:root:/root:/bin/bash 2)word&:待搜寻的字符串(word)行尾 【例】 [root@xuegod63tmp]#grepbash$passwd 3)“”去除特殊符号的特殊意义 【例】搜寻包括单引号'的行,并把行号也打印出来 [root@xuegod63tmp]#grep-n--color'/tmp/passwd 8:halt:x:7:0:'halt':/sbin:/sbin/halt 9:'mail':x:8:12:mail:/var/spool/mail:/sbin/nologin 4)“*”重复零个到无穷多个的前一个字符 搜寻包括sp,后面o重复2次以上的行。记得要写两个o [root@xuegod63tmp]#grepspoo*passwd--color 5)[list]:字符集合,里面列出想要选择的字符 搜寻包括ga或者go的行: [root@xuegod63test]#grepg[ao]passwd--color games:x:12:100:games:/usr/games:/sbin/nologin gopher:x:13:30:gopher:/var/gopher:/sbin/nologin 6)搜寻不以#号开头的行 [root@xuegod63tmp]#grep^[^#]/tmp/passwd 7)[n1-n2]:字符集合的,里面列出想要包括的字符范围 搜寻含有数字的3和4的行: [root@xuegod63tmp]#grep[3-4]passwd?color 搜寻含有数字的行: [root@xuegod63tmp]#grep[0-9]passwd--color 找出开始为小写字母的 [root@xuegod63tmp]#grep^[a-z]passwd 开始为大定写字母: [root@xuegod63tmp]#grep^[A-Z]passwd Mk2:x:502:500::/home/mk:/bin/bash Mk3:x:503:500::/home/mk:/bin/bash 那如果我不想要开头是英文字母:^[^#] [root@xuegod63tmp]#grep^[^a-zA-Z]passwd 显示空白行及行号: [root@xuegod63tmp]#grep-n^$passwd
正则表达式中。“.”代表绝对有一个任意字符的意思;而“*”代表重复前一个字符到无穷次的意思。任长度的字符表示方法:.* 寻找包括有r开头和t结束且长度为四个字符行: [root@xuegod63tmp]#grepr..tpasswd--color 寻找oo,ooo,oooo等等的数据,也就是说,至少要有两个o以上: [root@xuegod63tmp]#grepooo*passwd--color
寻找包括g开头和g结束的字符串,中间可有可无 grep^g.*gpasswd--color
二、BRE和ERE的区别Linux正则表达式(RegularExpression)主要遵从POSIX标准。POSIX有两种风格的正则表达式:基本正则表达式(BRE)与扩展正则表达式(ERE)。 1“”两者都可指关闭或打开后续字符的特殊意义。 2“*”两者都可匹配单个字符,null(空值)除外。 3“*”两者都可指匹配*之前单个字符的任意次(N>=0)。但是*在开头时,ERE中的意义为匹配空字符任意次,相当于没有*。在BRE中写在开头就表示*这个字符。 4“^”两者都可匹配^后面的正则表达式或字符串,从行首匹配。但在BRE中,只有放在表达式的开头才有特殊意义。如:grep‘^a^b^c’test.sh会匹配出行首为a^b^c的行,不匹配123a^b^c的行。在ERE中,^放在表达式的任何位置都有意义。如:grep‘^a^b^c’test.sh不匹配任何字符。 5“$”两者都可匹配&前面的正则表达式或字符串。不同点同^。 6“[…]”两者都可方括号表达式,中间用-连接。^在[…]中表示相反。如:grep[^a-z]test.sh指的是除所有有小写字母的行。 7“{m,n}”BER为区间表达式,匹配表达式前至少m次,至多n次。 8“()”BER为组合表达式,最多有9个这样的子模式,格式例如‘(ab)#(ab)#’ n为第几个小括号这里n值为1或2。其中#为表达式 例1: [root@xuegod63tmp]#grep'(['dbw'])'1.sh?color#匹配dbw中任意一个字符任意次 dw dbwidb [root@xuegod63tmp]#grep'dbw'1.sh--color#只匹配出dbw连续的字符串 dbwidb 例2: [root@xuegod63tmp]#grep'(ab){0,1}(ac)*(ad).*3'1.sh--color abacadadadad abacadadadadadcwead 可以得出组合表达式的通式为:ab#ac#ad#ad#ad#。。。。。 9“{m,n}”ERE用法同BRE。 10“+”ERE匹配其前面表达式>=1次 11“?”ERE匹配前面表达式<=1次 12“|”ERE匹配前或后的表达式 13“()”ERE匹配小括号里的表达式群 说明:10到13四个符号都要求前面或后面为表达式,如果没有则特殊含义将跳过, “?+”等价于“*”。 三、sedstremeditor流编辑器 sed编辑器是一行一行的处理文件内容的。正在处理的内容存放在模式空间(缓冲区)内,处理完成后按照选项的规定进行输出或文件的修改。 sed是一种在线编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(patternspace),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作; 1.语法sed[options]‘[command]’[filename] [root@xuegod163~]#sed's/root/rm/'/etc/passwd>newfilename options: -n抑制自动(默认的)输出***读取下一个输入行 -e执行多个sed指令 -f运行脚本 -i编辑文件内容*** -i.bak编辑的同时创造.bak的备份 -r使用扩展的正则表达式*** command: a在匹配后追加*** i在匹配后插入*** p打印*** d删除*** r/R读取文件/一行 w另存 s查找 c替换 y替换 h/H复制拷贝/追加模式空间(缓冲区)到存放空间 g/G粘贴从存放空间取回/追加到模式空间 x两个空间内容的交换 n/N拷贝/追加下一行内容到当前 D删除n之前的内容 P打印n之前的内容 b无条件跳转 t满足匹配后的跳转 T不满足匹配时跳转 【例】 1)显示文件第三行 [root@xuegod63tmp]#sed-n'3p'passwd daemon:x:2:2:daemon:/sbin:/sbin/nologin 2)显示文件前三行 [root@xuegod63tmp]#sed-n'1,3p'passwd root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin 3)显示文件除前三行之外的全部内容 [root@xuegod63tmp]#sed-n'1,3!p'passwd 4)显示文件第三行和之后的三行 [root@xuegod63tmp]#sed-n'3,+3p'passwd 5)在文件头插入“###” [root@xuegod63tmp]#sed'1i###'passwd>a.txt 6)在文件尾插入"@@@" [root@xuegod63tmp]#sed'$a@@@'passwd>a.txt 7)把文件第三行替换成“$$$” [root@xuegod63tmp]#sed'3c$$$'passwd 8)复制粘贴 把文件的第二行到第四行复制到文件的末尾 [root@xuegod63tmp]#sed'2,4H;$G'passwd>b.txt h/粘贴从存放空间取回/追加到模式空间 2.sed中的正则^$.* 【例】 1)删除空行d删除*** [root@xuegod63tmp]#sed'/^$/d'passwd>c.txt 2)把fstab中包含ext4的记录(行)写入新的文件中 [root@xuegod63tmp]#sed'/ext4/wnewfstab2'/etc/fstab 四、awk 1说明AWK是一种优良的文本处理工具,Linux及Unix环境中现有的功能最强大的数据处理引擎之一。这种编程及数据操作语言的最大功能取决于一个人所拥有的知识。awk命名:AlfredAhoPeterWeinberger和briankernighan三个人的姓的缩写。 最简单地说,AWK是一种用于处理文本的编程语言工具。 任何awk语句都是由模式和动作组成,一个awk脚本可以有多个语句。模式决定动作语句的触发条件和触发时间。 2特殊字段BEGIN语句设置计数和打印头部信息,在任何动作之前进行。 END语句输出统计结果,在完成动作之后执行。 3分隔符默认是空格可以用-F,改变成逗号为分隔符-F,或改成冒号-F: 4安装软件[root@xuegod63tmp]#rpm-qf`whichawk` gawk-3.1.7-6.el6.x86_64 [root@xuegod63tmp]#rpm-qf`whichsed` sed-4.2.1-7.el6.x86_64 【例】准备要显示的内容: #vimresult.txt andy48592789488 bob68990759086 claire98488809284 dave594528486NA 1)自定义年月日的显示方式: Year:2015month:Febdays:11 [root@xuegod63tmp]#date|awk'{print"Year:"$6"tmonth:"$2"tdays:"$3}' Year:2015month:Febdays:11 2)显示所有内容: #awk'{print$0}'result.txt 3)显示第一行,以:作为分隔符 [root@xuegod63tmp]#awk-F:'{print$1}'/etc/passwd 4)显示第一列和第三列的内容。 [root@xuegod63tmp]#awk'{print$1,$3}'result.txt andy85 bob89 claire84 dave94 5)打印一个文件头,打印一个文件尾 特殊字段: BEGIN语句设置计数和打印头部信息,在任何动作之前进行。 END语句输出统计结果,在完成动作之后执行。 [root@xuegod63tmp]#awk'BEGIN{print"namelevelresultn"}{print$1,$2,$3}END{print"endofclass1results"}'result.txt namelevelresult andy485 bob689 claire984 dave594 endofclass1results 6)第二列大于等于5的那些记录 [root@xuegod63tmp]#awk'$2>=5{print$0}'result.txt bob68990759086 claire98488809284 dave594528486NA 7)显示用户名为andy或(和)第二列为9的记录 [root@xuegod63tmp]#awk'{if($1=="andy"||$2=="9")print$0}'result.txt [root@xuegod63tmp]#awk'{if($1=="andy"&&$2=="9")print$0}'result.txt
学神-IT-教育51cto技术交流群:468845589快来上我们公开课吧! 学神MK老师:1273815479 学神ZY老师:3054384936
学神教育学神-IT-1508班-逍遥编译提供 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |