本文出自:http://xuegodlinux.blog.51cto.com/10844319/1713884
一、正则表达式概念
正则表达式,又称正规表示法、常规表示法(英语:Regular Expression,在代码中常简写为regex、regexp或RE),计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。
是指一个用来描述或者匹配一系列符合某个句法规则的字符的那个字符串。
用某种模式去匹配一类字符串。
1.格式
使用grep
-v 不匹配
-n 显示行号
【例】
[root@xuegod63 tmp]# grep -n 'w[oa]rld' a.txt #查看a.txt中包含world或warld的行并显示行号
[root@xuegod63 tmp]#grep -v "<!--" b.xml #查看b.xml不包含注释的部分
2.正则表达式中特殊字符
1) ^word:待搜寻的字符串(word)在行首
搜寻“root”开始的行:
【例】
[root@xuegod63 tmp]# grep ^root passwd
root:x:0:0:root:/root:/bin/bash
2) word&:待搜寻的字符串(word)行尾
【例】
[root@xuegod63 tmp]# grep bash$ passwd
3) “\”去除特殊符号的特殊意义
【例】搜寻包括单引号 '的行,并把行号也打印出来
[root@xuegod63 tmp]# 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@xuegod63 tmp]# grep spoo* passwd --color
5) [list]:字符集合,里面列出想要选择的字符
搜寻包括ga或者go的行:
[root@xuegod63 test]# grep g[ao] passwd --color
games:x:12:100:games:/usr/games:/sbin/nologin
gopher:x:13:30:gopher:/var/gopher:/sbin/nologin
6) 搜寻不以#号开头的行
[root@xuegod63 tmp]# grep ^[^#] /tmp/passwd
7) [n1-n2]:字符集合的,里面列出想要包括的字符范围
搜寻含有数字的3和4的行:
[root@xuegod63 tmp]# grep [3-4] passwd �color
搜寻含有数字的行:
[root@xuegod63 tmp]# grep [0-9] passwd --color
找出开始为小写字母的
[root@xuegod63 tmp]# grep ^[a-z] passwd
开始为大定写字母:
[root@xuegod63 tmp]# grep ^[A-Z] passwd
Mk2:x:502:500::/home/mk:/bin/bash
Mk3:x:503:500::/home/mk:/bin/bash
那如果我不想要开头是英文字母: ^[^#]
[root@xuegod63 tmp]# grep ^[^a-zA-Z] passwd
显示空白行及行号:
[root@xuegod63 tmp]# grep -n ^$ passwd
正则表达式中。“.”代表绝对有一个任意字符的意思;而“*”代表重复前一个字符到无穷次的意思。 任长度的字符表示方法: .*
寻找包括有r开头和t结束且长度为四个字符行:
[root@xuegod63 tmp]# grep r..t passwd --color
寻找oo,ooo,oooo 等等的数据,也就是说,至少要有两个o 以上:
[root@xuegod63 tmp]# grep ooo* passwd --color
寻找包括g开头和g结束的字符串,中间可有可无
grep ^g.*g passwd --color
二、BRE和ERE的区别
Linux正则表达式(Regular Expression)主要遵从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@xuegod63 tmp]# grep '\(['dbw']\)' 1.sh �color #匹配dbw中任意一个字符任意次
dw
dbwidb
[root@xuegod63 tmp]# grep 'dbw' 1.sh --color #只匹配出dbw连续的字符串
dbwidb
例2:
[root@xuegod63 tmp]# grep '\(ab\)\{0,1\}\(ac\)*\(ad\).*\3' 1.sh --color
ab ac ad ad ad ad
abacadadadadadcwe ad
可以得出组合表达式的通式为:ab#ac#ad#ad#ad#。。。。。
9 “{m,n}”ERE 用法同BRE。
10 “+” ERE 匹配其前面表达式>=1次
11 “?” ERE 匹配前面表达式<=1次
12 “|” ERE 匹配前或后的表达式
13 “()” ERE 匹配小括号里的表达式群
说明:10到13 四个符号都要求前面或后面为表达式,如果没有 则特殊含义将跳过,
“?+”等价于“*”。
三、sed
strem editor 流编辑器
sed编辑器是一行一行的处理文件内容的。正在处理的内容存放在模式空间(缓冲区)内,处理完成后按照选项的规定进行输出或文件的修改。
sed 是一种在线编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用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@xuegod63 tmp]# sed -n '3p' passwd
daemon:x:2:2:daemon:/sbin:/sbin/nologin
[root@xuegod63 tmp]# 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@xuegod63 tmp]# 显示文件第三行和之后的三行
[root@xuegod63 tmp]# sed -n '3,+3p' passwd
5)在文件头插入“###”
[root@xuegod63 tmp]# sed '1i###' passwd > a.txt
6)在文件尾插入"@@@"
[root@xuegod63 tmp]# sed '$a@@@' passwd > a.txt
7)把文件第三行替换成“$$$”
[root@xuegod63 tmp]# sed '3c$$$' passwd
8)复制粘贴
[root@xuegod63 tmp]# sed '2,4H;$G' passwd > b.txt
h/G粘贴 从存放空间取回/追加到模式空间
2.sed中的正则
^ $ . *
【例】
[root@xuegod63 tmp]# sed '/^$/d' passwd > c.txt
2)把fstab中包含ext4的记录(行)写入新的文件中
[root@xuegod63 tmp]# sed '/ext4/w newfstab2' /etc/fstab
四、awk
1 说明
AWK是一种优良的文本处理工具,Linux及Unix环境中现有的功能最强大的数据处理引擎之一。这种编程及数据操作语言的最大功能取决于一个人所拥有的知识。awk命名:Alfred Aho Peter Weinberger和brian kernighan三个人的姓的缩写。
最简单地说, AWK 是一种用于处理文本的编程语言工具。
任何awk语句都是由模式和动作组成,一个awk脚本可以有多个语句。模式决定动作语句的触发条件和触发时间。
2 特殊字段
BEGIN语句设置计数和打印头部信息,在任何动作之前进行。
3 分隔符
默认是空格可以用-F,改变成逗号为分隔符 -F,或改成冒号 -F:
4 安装软件
[root@xuegod63 tmp]# rpm -qf `which awk`
gawk-3.1.7-6.el6.x86_64
[root@xuegod63 tmp]# rpm -qf `which sed`
sed-4.2.1-7.el6.x86_64
#vim result.txt
andy 4 85 92 78 94 88
bob 6 89 90 75 90 86
claire 9 84 88 80 92 84
dave 5 94 52 84 86 NA
Year:2015month:Febdays:11
[root@xuegod63 tmp]# date | awk '{print "Year:"$6 "\t month:"$2 "\t days:"$3}'
Year:2015 month:Feb days:11
#awk '{print $0}' result.txt
3)显示第一行,以:作为分隔符
[root@xuegod63 tmp]# awk -F: '{ print $1 }' /etc/passwd
[root@xuegod63 tmp]# awk '{print $1,$3}' result.txt
andy 85
bob 89
claire 84
dave 94
特殊字段:
BEGIN语句设置计数和打印头部信息,在任何动作之前进行。
[root@xuegod63 tmp]# awk 'BEGIN {print "name level result\n"} {print $1,$2,$3} END{ print "end of class1 results"}' result.txt
name level result
andy 4 85
bob 6 89
claire 9 84
dave 5 94
end of class1 results
6)第二列大于等于5的那些记录
[root@xuegod63 tmp]# awk '$2 >= 5 {print $0}' result.txt
bob 6 89 90 75 90 86
claire 9 84 88 80 92 84
dave 5 94 52 84 86 NA
[root@xuegod63 tmp]# awk '{ if($1 == "andy" || $2=="9") print $0 }' result.txt
[root@xuegod63 tmp]# awk '{ if($1 == "andy" && $2=="9") print $0 }' result.txt