一、正则表达式概念
正则表达式,又称正规表示法、常规表示法(英语: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四个符号都要求前面或后面为表达式,如果没有则特殊含义将跳过,
“?+”等价于“*”。
三、sed
stremeditor流编辑器
sed编辑器是一行一行的处理文件内容的。正在处理的内容存放在模式空间(缓冲区)内,处理完成后按照选项的规定进行输出或文件的修改。
sed是一种在线编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(patternspace),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;
1.语法
sed[options]‘[command]’[filename]
[root@xuegod163~]#sed's/root/rm/'/etc/passwd>newfilename
options:
-e执行多个sed指令
-f运行脚本
-i.bak编辑的同时创造.bak的备份
-r使用扩展的正则表达式***
command:
a在匹配后追加***
i在匹配后插入***
p打印***
d删除***
r/R读取文件/一行
w另存
s查找
c替换
y替换
h/H复制拷贝/追加模式空间(缓冲区)到存放空间
g/G粘贴从存放空间取回/追加到模式空间
x两个空间内容的交换
n/N拷贝/追加下一行内容到当前
P打印\n之前的内容
b无条件跳转
t满足匹配后的跳转
T不满足匹配时跳转
【例】
[root@xuegod63tmp]#sed-n'3p'passwd daemon:x:2:2:daemon:/sbin:/sbin/nologin
[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
[root@xuegod63tmp]#sed-n'1,3!p'passwd
[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中的正则
^$.*
【例】
[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语句设置计数和打印头部信息,在任何动作之前进行。
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
Year:2015month:Febdays:11 [root@xuegod63tmp]#date|awk'{print"Year:"$6"\tmonth:"$2"\tdays:"$3}' Year:2015month:Febdays:11
#awk'{print$0}'result.txt
3)显示第一行,以:作为分隔符
[root@xuegod63tmp]#awk-F:'{print$1}'/etc/passwd
[root@xuegod63tmp]#awk'{print$1,$3}'result.txt andy85 bob89 claire84 dave94
特殊字段:
BEGIN语句设置计数和打印头部信息,在任何动作之前进行。
[root@xuegod63tmp]#awk'BEGIN{print"namelevelresult\n"}{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
[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班-逍遥编译提供
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。