本节内容

       正则表达式

       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

在匹配后追加 ***

在匹配后插入 ***

p 打印 ***

d 删除 ***

r/R读取文件/一行

w 另存

查找

替换

替换

h/H(复制)拷贝/追加模式空间(缓冲区)到存放空间

g/G (粘贴)从存放空间取回/追加到模式空间

x   两个空间内容的交换

n/N拷贝/追加下一行内容到当前

删除 \n 之前的内容

打印 \n 之前的内容

无条件跳转

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