本节内容
正则表达式
sed
awk
正则表达式,又称正规表示法,常规表示法(英语:Regular Expression),在代码中常写为regex、regexp 或RE), 计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。
是指一个用来描述或匹配一系列符合某个句法规则的字符的那个字符串
用某种模式去匹配一类字符串。
使用grep
-v 不匹配
-n 显示行号
1.正则表达式中特殊字符
(1) ^word : 待搜寻的字符串(word)在行首!
搜寻“root”开始的行:
例:
[root@xuegod63tmp]# grep root passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@xuegod63tmp]#
[root@xuegod63tmp]# grep ^root passwd
root:x:0:0:root:/root:/bin/bash
(2)word$ : 搜寻以字符串(word)结尾的行
搜寻“bash” 结尾的行:
例:
[root@xuegod63tmp]# grep bash$ passwd
root:x:0:0:root:/root:/bin/bash
zhh:x:500:500:zhh:/home/zhh:/bin/bash
mysql:x:27:27:MySQLServer:/var/lib/mysql:/bin/bash
(3) \ : 将特殊符号的特殊意义去除
例:搜寻包括单引号 ' 的行 , 并把行号也打印出来
[root@xuegod63tmp]# grep \' passwd
'p'x:4:7:lp:/var/spool/lpd:/sbin/nologin
'p:x:4:7:lp:/var/spool/lpd:/sbin/nologin
[root@xuegod63tmp]# grep -n --color \' /tmp/passwd
(4) * :重复零个 到无穷多个的前一个字符
搜寻包括sp,后面o重复2次以上的行。记得要写两个o
[root@xuegod63tmp]# grep spoo* passwd
(5) [list] : 字符集合,里面列出想要选择的字符
搜寻包括 ga 或者 go的行:
[root@xuegod63tmp]# grep g[ao] /tmp/passwd
games:x:12:100:games:/usr/games:/sbin/nologin
gopher:x:13:30:gopher:/var/gopher:/sbin/nologin
(6)搜寻 不以#号 开头的行
[root@xuegod63tmp]# grep ^# passwd #以井号开头的
#root:x:0:0:root:/root:/bin/bash
#bin:x:1:1:bin:/bin:/sbin/nologin
[root@xuegod63tmp]# grep ^[^#] passwd # 不以井号开头的
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
uucp:x:10:14:uu'p:/var/spool/uucp:/sbin/nologin
(7) [n1-n2]: 字符集合 ,里面列出包括的字符范围
1搜寻含有数字的3和4的行
[root@xuegod63tmp]# grep [3-4] passwd --color
#adm:x:3:4:adm:/var/adm:/sbin/nologin
#lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
#'p'x:4:7:lp:/var/spool/lpd:/sbin/nologin
2找出开头为小写字母的行
[root@xuegod63tmp]# grep ^[a-z] passwd #搜寻以a到z开头的行
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
搜不以字母a 到 z 开头的行
[root@xuegod63tmp]# grep ^[^a-z] passwd
#root:x:0:0:root:/root:/bin/bash
#bin:x:1:1:bin:/bin:/sbin/nologin
[root@xuegod63tmp]# grep ^[^a-zA-Z] passwd
显示空白行及行号:
[root@xuegod63tmp]# grep -n ^$ passwd
35:
3.正则表达式中 “.”代表绝对有一个任意字符的意思: 而“*”代表重复前一个到无穷次的意思
任意长度的字符表示方法: .*
寻找 r开头 和 t 结束 且长度为四个字符的行:
[root@xuegod63tmp]# grep r..t passwd --color
#root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
ftp:x:14:50:FTPUser:/var/ftp:/sbin/nologin
以root开头
[root@xuegod63tmp]# grep ^r..tpasswd --color
root:x:0:0:root:/root:/bin/bash
寻找oo,ooo,oooo等等的数据,也就是说,至少要有两个o以上:
[root@xuegod63tmp]# grep ooo* passwd --color
root:x:0:0:root:/root:/bin/bash
#lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
'p'x:4:7:lp:/var/spool/lpd:/sbin/nologin
寻找 g 开头 和 g 结束的字符串,中间可有可无。
[root@xuegod63tmp]# grep ^g.*g$ passwd
glp:x:4:7:lp:/var/spool/lpd:/sbin/nologig
sed
stremeditor 流编辑器
sed编辑器是一行一行的处理文件内容的。正在处理的内容存放在模式空间(缓冲区)内,处理完成后按照选项的规定进行输出或文件的修改。
sed是一种在线编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed 命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。sed 主要用来自动编辑一个或多个文件;简化对文件的反复操作;
语法:
sed[options] '[command]' [filename]
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
#adm:x:3:4:adm:/var/adm:/sbin/nologin
glp:x:4:7:lp:/var/spool/lpd:/sbin/nologig
'p'x:4:7:lp:/var/spool/lpd:/sbin/nologin
#'p:x:4:7:lp:/var/spool/lpd:/sbin/nologin
....
4显示文件第三行和之后的三行
[root@xuegod63tmp]# sed -n '3,+3p' passwd
#daemon:x:2:2:daemon:/sbin:/sbin/nologin
#adm:x:3:4:adm:/var/adm:/sbin/nologin
glp:x:4:7:lp:/var/spool/lpd:/sbin/nologig
'p'x:4:7:lp:/var/spool/lpd:/sbin/nologin
在文件开头 插入 ******
[root@xuegod63tmp]# sed '1i******' passwd | more
如果想保存 需要重定向
sed '1i******' passwd > a.txt
在文件结尾追加 “@@@”
[root@xuegod63tmp]# sed '$a@@@' passwd >a.txt
把文件第三行替换成“qiutiandeyu”
[root@xuegod63tmp]# sed '3c qiutiandeyu' passwd
root:x:0:0:root:/root:/bin/bash
#bin:x:1:1:bin:/bin:/sbin/nologin
qiutiandeyu
复制粘贴
把文件的第二行到第四行复制到文件的末尾
[root@xuegod63tmp]# sed '2,4H;$G' passwd
sed中的正则:
^ $ . *
例子:
1删除空行 d 删除
[root@xuegod63tmp]# sed '/^$/d' passwd > a.txt
把fstab 中 包含 ext4 的记录(行) 写入新的文件中
[root@xuegod63tmp]# sed '/ext4/w newfstab' /etc/fstab
[root@xuegod63tmp]# cat newfstab
UUID=bcb13b44-26f0-4f00-ac7c-71387b41c6ac/ ext4 defaults 1 1
UUID=d4382c26-3adc-4f0b-a754-e1c85ff5a1dd/boot ext4 defaults 1 2
awk
awk是一种优良的文本处理工具,Linux 及 Unix 环境中现有的功能最强大的数据处理引擎之一。这种编程及数据操作语言(其名称得自于它的创始人阿尔佛雷德.艾候、彼得.温伯格和布莱恩.柯林汉姓氏的首个字母) 的最大功能取决于一个人所拥有的知识。awk 是Alfred Aho Per Weinberger 和
brianKernighan 三个人姓的缩写。
最简单的说,AWK是一种用于处理文本的编程语言工具。
任何awk语句都是由模式和动作组成,一个awk脚本可以有多个语句。模式决定动作语句的触发条件和触发时间。
特殊字段:
BEGIN语句设置计数和打印头部信息,在任何动作之前进行。END语句输出统计结果,在完成动作之后执行
分隔符默认是空格,可以用-F,改变成逗号为分隔符-F,改成冒号 -F:
安装软件:
[root@xuegod63 ~]# rpm -qf `which awk`
gawk-3.1.7-10.el6.x86_64
例子:
1自定义年月日的显示方式:
Year:2016 month:Fri days:7
[root@xuegod63~]# date | awk '{print "Year:"$6 "\t month:"$2 "\tdays:"$3}'
Year:2016 month:Jun days:17
准备要显示的内容:
#vimresult.txt
andy4 85 92 78 94 88
bob6 89 90 75 90 86
claire9 84 88 80 92 84
dave5 94 52 84 86 NA
例2 显示所有内容
[root@xuegod63~]# awk '{print $0}' result.txt # $0 显示全部
andy4 85 92 78 94 88
bob6 89 90 75 90 86
claire9 84 88 80 92 84
dave5 94 52 84 86 NA
例3 显示第一列,以:作为分隔符
[root@xuegod63tmp]# awk -F: '{print $1}' /etc/passwd
例4 显示第一列和第三列的内容
[root@xuegod63~]# awk '{print $1,$3}' result.txt
andy85
bob89
claire84
dave94
例5 打印一个文件头,打印一个文件尾
BEGIN语句设置计数和打印头部信息,在任何动作之前进行。
END语句输出统计结果,在完成动作之后执行
[root@xuegod63~]# awk 'BEGIN{print"name levelresult\n"}{print $1,$2,$3} END{print"\nend of class1 results"}'result.txt
namelevel result
andy4 85
bob6 89
claire9 84
dave5 94
endof class1 results
第二列大于等于5的那些记录
[root@xuegod63~]# awk '$2 >= 5 {print $0}' result.txt
bob6 89 90 75 90 86
claire9 84 88 80 92 84
dave5 94 52 84 86 NA
显示用户名为andy或 (和) 第二列为9的记录
[root@xuegod63~]# awk '{ if($1 == "andy" || $2 == "9") print $0}'result.txt
andy4 85 92 78 94 88
claire9 84 88 80 92 84
[root@xuegod63~]# awk '{ if($1 == "andy" && $2 == "9") print $0}'result.txt