加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

【学神】 1-20正则表达式以及sed、awk的使用

发布时间:2020-12-14 04:36:32 所属栏目:百科 来源:网络整理
导读:本文出自:http://xuegodlinux.blog.51cto.com/10844319/1713884 一、正则表达式概念 正则表达式,又称正规表示法、常规表示法(英语:Regular Expression,在代码中常简写为regex、regexp或RE),计算机科学的一个概念。正则表达式使用单个字符串来描述、匹

本文出自: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

wKioL1aA6y7gHG48AACO5Uf3Dmc623.png

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@xuegod63 tmp]# sed -n '3p' passwd

daemon:x:2:2:daemon:/sbin:/sbin/nologin

2)显示文件前三行

[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

3)显示文件除前三行之外的全部内容

[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中的正则

^ $ . *

【例】

1)删除空行 d删除 ***

[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语句设置计数和打印头部信息,在任何动作之前进行。

END语句输出统计结果,在完成动作之后执行。

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

1)自定义年月日的显示方式:

Year:2015month:Febdays:11

[root@xuegod63 tmp]# date | awk '{print "Year:"$6 "t month:"$2 "t days:"$3}'

Year:2015 month:Feb days:11

2)显示所有内容:

#awk '{print $0}' result.txt

3)显示第一行,以:作为分隔符

[root@xuegod63 tmp]# awk -F: '{ print $1 }' /etc/passwd

4)显示第一列和第三列的内容。

[root@xuegod63 tmp]# awk '{print $1,$3}' result.txt

andy 85

bob 89

claire 84

dave 94

5)打印一个文件头,打印一个文件尾

特殊字段:

BEGIN语句设置计数和打印头部信息,在任何动作之前进行。

END语句输出统计结果,在完成动作之后执行。

[root@xuegod63 tmp]# awk 'BEGIN {print "name level resultn"} {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

7)显示用户名为andy或(和)第二列为9的记录

[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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读