文章目录

前言

sed介绍

  • 1. sed介绍
  • 2.sed语法介绍
  • 3.sed脚本命令
  • 1.打印
  • 2.s 替换
  • 3.删除脚本命令 d
  • 3.插入脚本命令 a/i
  • 4.行替换脚本命令 c
  • 4.字符替换脚本 y
  • 5.保存内容脚本 w
  • 6.插入其他文本 r
  • 6.中断退出脚本命令 q
  • 脚本命令当中的地址[address]
  • 正则表达式
  • sed [选项]
  • 1.sed -i 选项
  • 2. sed -e选项
  • 3.sed -f 选项
  • 4.sed -r 选项
  • 总结
  • 友情链接



前言


吐血整理sed入门到精通,sed语法,脚本命令,打印,替换,删除,插入,行替换,字符替换,保存,插入,中断,脚本地址,正则表达式,sed实操手册。


sed介绍

1. sed介绍

vi是用交互式方式编辑文本,通常用键盘增删改文本数据。sed 命令不同,它采用的是流编辑模式,在处理数据之前,需预先提供规则,它会按照此规则来编辑数据。
sed 通过命令处理文本文件中的数据,这些命令可以通过命令行输入或者存储在文本文件中。通过指定的规则匹配并修改数据。
注意,sed 默认不会直接修改源文件数据,而是将数据复制到缓冲区中对其进行操作;
它的执行顺序是每次仅读取一行内容,当一行数据匹配完成后,继续读取下一行数据,重复这个过程,直到将文件中所有数据处理完毕。

2.sed语法介绍

[root@zaishu~]# sed [选项] [脚本命令] 文件名

选项

含义

-e 脚本命令

该选项会将其后跟的脚本命令添加到已有的命令中。

-f 脚本命令文件

该选项会将其后文件中的脚本命令添加到已有的命令中。

-n

默认情况下,sed 会在所有的脚本指定执行完毕后,会自动输出处理后的内容,而该选项会屏蔽启动输出,需使用 print 命令来完成输出。

-i

此选项会直接修改源文件,要慎用。

-r :

-r :sed 的动作支持的是延伸型正规表示法的语法。(默认是基础正规表示法语法)

重点是在于这个脚本命令如何定义。

3.sed脚本命令

语法:
[root@zaishu~]# sed [选项] [脚本命令] 文件名
这一章节会详细介绍sed当中最重要的**[脚本命令]**

1.打印

在sed当中也可以操作类似grep的功能,根据关键字进行过滤打印文本内容。
语法格式如下:

sed (-n) [address]p   // 全输出  
sed  (-n)  [address]/p  
-n :  默认情况下,sed 会在脚本指定执行完毕后,自动输出处理后的全文内容,而该选项会屏蔽启动输出,需使用 p命令来完成只只输出处理过的内容。
address 表示指定要操作的行,不指定的时候,默认就是指对全部文本做动作。也持正则表达式来指定
p:匹配字符串的那些行,打印出来(输出到屏幕)

例1. 打印全文

[root@zaishu ~]# sed -n p /etc/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
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
...
oracle:x:1002:1002::/home/oracle:/bin/bash

例2. 匹配指定字符

打印包含zaishu的行
[root@zaishu zaishu]# sed -n '/zaishu/p' sedtxt 
welcome to zaishu.cn welcome to zaishu.cn
welcome to zaishu.cn welcome to zaishu.cn

例3. 使用正则表达式进行匹配
具体正则式的使用细节,可以参照上一讲。在sed当中也是适用的。

打印hello开头的行
[root@zaishu zaishu]# sed -n '/^hello/p' sedtxt 
hello sed

打印包含7或者8数字的行 和第二行

[root@zaishu zaishu]# sed -n '/[7-8]\|2/p' /etc/passwd
daemon:x:2:2:daemon:/sbin:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:999:998:User for polkitd:/:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin
saslauth:x:998:76:Saslauthd user:/run/saslauthd:/sbin/nologin
oracle:x:1002:1002::/home/oracle:/bin/bash

2.s 替换

[root@zaishu~]# sed [选项] [脚本命令] 文件名
//为了方便讲解替换,替换当中不加[选项],重点讲解[脚本命令]。

s替换 脚本命令格式如下:

格式为:[address]s/pattern/replacement/flags
address 表示指定要操作的行,不指定的时候,默认就是指对全部文本做动作(具体用法,下面例子都是不指定,全文操作)。
pattern 指替换前的内容
replacement 指替换后的新内容。
flags:它的作用是对匹配出的内容再做二次过滤或其他动作。

flags

功能

n

1~512表示指定要替换的字符串出现第几次时才进行替换,例一行有 3 个C但只想替换第二个 C,使用这个标记

g

全局替换,表示对匹配的所有内容替换。没有 g,只会对第一次匹配做替换操作。例一行数据中有 3 个 C,则只会替换第一个C;

p

额外再打印匹配的行。通常与选项-n一起使用(参照sed语法),表示只打印匹配的行。

w file

将缓冲区中的数据保存到file 文件中;

replacement

功能

&

引用匹配的内容

\1,2…n

引用匹配的第n个内容,在匹配的内容中用\(\) 分组指定,可参照之前正则表达式讲解的分组

例1. 替换第一个字符串

[root@zaishu zaishu]# sed  's/shu/su/' sedtxt 
hello sed
welcome to zaisu.cn welcome to zaishu.cn
welcome to zaisu.cn welcome to zaishu.cn

[root@zaishu zaishu]# cat sedtxt 
hello sed
welcome to zaishu.cn welcome to zaishu.cn
welcome to zaishu.cn welcome to zaishu.cn

这个例子可以得到以下知识点:

  1. 脚本命令不指定n的时候,只会处理第一个字符串
  2. 不指定address,是对全文进行匹配处理
  3. 命令执行后,输出的内容是全文
  4. 默认情况下,原文本内容并没有替换。

例2. 只替换行内的第二个字符串

[root@zaishu zaishu]# sed 's/shu/su/2' sedtxt 
hello sed
welcome to zaishu.cn welcome to zaisu.cn   //第一个shu没有替换,只替换了了每行的第二个
welcome to zaishu.cn welcome to zaisu.cn

例3. 匹配每行的所有字符串

[root@zaishu zaishu]# sed  's/shu/su/g' sedtxt 
hello sed
welcome to zaisu.cn welcome to zaisu.cn
welcome to zaisu.cn welcome to zaisu.cn

例4.只打印替换的行

脚本命令当中的p表示额外打印操作的行,如下
[root@zaishu zaishu]# sed 's/shu/su/p' sedtxt 
hello sed
welcome to zaisu.cn welcome to zaishu.cn
welcome to zaisu.cn welcome to zaishu.cn
welcome to zaisu.cn welcome to zaishu.cn
welcome to zaisu.cn welcome to zaishu.cn

只打印操作的行

这个时候需要结合sed 命令当中的-n 选项(参照sed语法),结合表示只打印操作的行,这两个结合会非常频繁使用。
[root@zaishu zaishu]# sed -n 's/shu/su/p' sedtxt 
welcome to zaisu.cn welcome to zaishu.cn
welcome to zaisu.cn welcome to zaishu.cn

例5. 保存操作的内容到文本

g表示全文处理 w表示将替换的行保存到sed2这个文本
[root@zaishu zaishu]# sed -n 's/shu/su/gw sed2' sedtxt 
[root@zaishu zaishu]# cat sed2
welcome to zaisu.cn welcome to zaisu.cn
welcome to zaisu.cn welcome to zaisu.cn

例6.转义
如果匹配的内容中包含特殊字符,类似路径的字符串,包含/需要将路径中的正斜线进行转义。
将/home/mysql 替换成/hm/my

[root@zaishu ~]# sed -n 's/\/home\/mysql/\/hm\/my/p' /etc/passwd
mysql:x:1001:1001::/hm/my:/sbin/nologin

例7.替换后的文本引用之前匹配的内容
替换后的文本可以引用之前匹配的内容。

replacement

功能

&

引用匹配的内容

\1,2…n

引用匹配的第n个内容,在匹配的内容中用\(\) 分组指定,可参照之前正则表达式讲解的分组

& : 引用之前匹配的内容,zaishu变成了www.zaishu
[root@zaishu zaishu]# sed -n 's/zaishu/www.&/p' sedtxt 
welcome to www.zaishu.cn welcome to zaishu.cn
welcome to www.zaishu.cn welcome to zaishu.cn

3.删除脚本命令 d

在sed 脚本命令d用于删除缓冲区当中匹配的行。
语法格式如下:

sed  [address]/d   //删除address范围,匹配内容的行
address:表示指定要操作的行,不指定的时候,默认就是指对全部文本做动作。可以进行条件匹配,支持正则表达式
d:  删除

例1. 删除所有行
这个效果就是不输出任何内容。

[root@zaishu zaishu]# cat sedtxt2 
This is zaishu.cn 1.
This is zaishu.cn 2.
This is zaishu.cn 3.
This is zaishu.cn 4.
This is zaishu.cn 5.
This is zaishu.cn 6.
This is zaishu.cn 7.
This is zaishu.cn 8.
This is zaishu.cn 9.
This is zaishu.cn 10.
This is zaishu.cn 11.
This is zaishu.cn 12.
This is zaishu.cn 13.
This is zaishu.cn 14.

[root@zaishu zaishu]# sed 'd' sedtxt2  //不输出任何内容

例2. 删除指定行

删除第一行
[root@zaishu zaishu]# sed '1d' sedtxt2 
This is zaishu.cn 2.
This is zaishu.cn 3.
This is zaishu.cn 4.
This is zaishu.cn 5.
This is zaishu.cn 6.
This is zaishu.cn 7.
This is zaishu.cn 8.
This is zaishu.cn 9.
This is zaishu.cn 10.
This is zaishu.cn 11.
This is zaishu.cn 12.
This is zaishu.cn 13.
This is zaishu.cn 14.

例3.删除多行
删除2-4行

[root@zaishu zaishu]# sed '2,4d' sedtxt2 
This is zaishu.cn 1.
This is zaishu.cn 5.
This is zaishu.cn 6.
This is zaishu.cn 7.
This is zaishu.cn 8.
This is zaishu.cn 9.
This is zaishu.cn 10.
This is zaishu.cn 11.
This is zaishu.cn 12.
This is zaishu.cn 13.
This is zaishu.cn 14.

或者用两个文本模式来指定范围

[root@zaishu zaishu]# sed '/2/,/4/d' sedtxt2 
This is zaishu.cn 1.
This is zaishu.cn 5.
This is zaishu.cn 6.
This is zaishu.cn 7.
This is zaishu.cn 8.
This is zaishu.cn 9.
This is zaishu.cn 10.
This is zaishu.cn 11.

例4. $ 可以代表结尾
如下表示删除3行后的所有行

[root@zaishu zaishu]# sed '3,$d' sedtxt2 
This is zaishu.cn 1.
This is zaishu.cn 2.

例5. 删除匹配字符串的行
删除包含“cn 11”的行

[root@zaishu zaishu]# sed '/cn 11/d' sedtxt2
This is zaishu.cn 1.
This is zaishu.cn 2.
This is zaishu.cn 3.
This is zaishu.cn 4.
This is zaishu.cn 5.
This is zaishu.cn 6.
This is zaishu.cn 7.
This is zaishu.cn 8.
This is zaishu.cn 9.
This is zaishu.cn 10.
This is zaishu.cn 12.
This is zaishu.cn 13.
This is zaishu.cn 14.

例7.通过正则表达式来匹配行
匹配13. 结尾的行

[root@zaishu zaishu]# sed '/13\.$/d' sedtxt2   
This is zaishu.cn 1.
This is zaishu.cn 2.
This is zaishu.cn 3.
This is zaishu.cn 4.
This is zaishu.cn 5.
This is zaishu.cn 6.
This is zaishu.cn 7.
This is zaishu.cn 8.
This is zaishu.cn 9.
This is zaishu.cn 10.
This is zaishu.cn 11.
This is zaishu.cn 12.
This is zaishu.cn 14.

3.插入脚本命令 a/i

a : 指定行的后面附加一行。 i : 在指定行的前面插入一行 。他们语法是一样的。
语法:
sed [address]/i(a)\内容 //在指定范围内,对匹配的行进行追加或者插入行。
例1. 插入/追加到行号

[root@zaishu zaishu]# sed '3i\asdfasd' sedtxt2
This is zaishu.cn 1.
This is zaishu.cn 2.
asdfasd
This is zaishu.cn 3.
This is zaishu.cn 4.
[root@zaishu zaishu]# sed '3a\asdfasd' sedtxt2
This is zaishu.cn 1.
This is zaishu.cn 2.
This is zaishu.cn 3.
asdfasd
This is zaishu.cn 4.

例2. 插入/追加多行

[root@zaishu zaishu]# sed '3i\
> this is 1 \
> is 2' sedtxt2

This is zaishu.cn 1.
This is zaishu.cn 2.
this is 1 
is 2
This is zaishu.cn 3.
This is zaishu.cn 4.

例3. 通过正则表达式匹配,来插入或者追加行

找到包含welcome的行,追加xxx的内容
[root@zaishu zaishu]# sed '/welcome/a\xxx' sedtxt
hello sed
welcome to zaishu.cn welcome to zaishu.cn
xxx
welcome to zaishu.cn welcome to zaishu.cn
xxx
找到包含sed结尾的行,追加内容
[root@zaishu zaishu]# sed '/sed$/a\xxx' sedtxt
hello sed
xxx
welcome to zaishu.cn welcome to zaishu.cn
welcome to zaishu.cn welcome to zaishu.cn

4.行替换脚本命令 c

语法. //在指定范围内,对匹配的行进行追加或者插入行。
sed  [address]/c\内容

例1. 替换第几行的内容

[root@zaishu zaishu]# sed '4c\change' sedtxt2
This is zaishu.cn 1.
This is zaishu.cn 2.
This is zaishu.cn 3.
change
This is zaishu.cn 5.

例3. 通过正则表达式匹配行,对其进行替换

匹配2. 结尾的行 ,将其替换成change
[root@zaishu zaishu]# sed '/2\.$/c\change' sedtxt2
This is zaishu.cn 1.
change
This is zaishu.cn 3.
This is zaishu.cn 4.
This is zaishu.cn 5.
This is zaishu.cn 6.
This is zaishu.cn 7.
This is zaishu.cn 8.
This is zaishu.cn 9.
This is zaishu.cn 10.
This is zaishu.cn 11.
change

4.字符替换脚本 y

在sed脚本命令中 处理单个字符需要使用y
语法:sed [address]//y/in/ot/
在指定范围内,对匹配的行当中内容进行字符替换。
y会对 in和 ot值进行一对一的映射,i替换成o;n替换成t。这过程会持续到处理完所有字符。如果 in和 ot 的长度不同,sed指定时候会报错。

例1. 替换全文内所有内容,将.替换成$ 将字母e替换成a

[root@zaishu zaishu]# sed 'y/.e/$a/' sedtxt
hallo sad
walcoma to zaishu$cn walcoma to zaishu$cn
walcoma to zaishu$cn walcoma to zaishu$cn

例2. 替换输出的内容

将1替换成2,2替换成4

[root@zaishu zaishu]# echo "2 is 1+1  " | sed 'y/12/24/' 
4 is 2+2

例3. 替换指定行号的字符

只替换第二行的字符
[root@zaishu zaishu]# sed '2y/.e/$a/' sedtxt
hello sed
walcoma to zaishu$cn walcoma to zaishu$cn
welcome to zaishu.cn welcome to zaishu.cn

例4. 通过正则表达式指定行
包含字符串welcome的行,对这些行 进行字符替换替换。

[root@zaishu zaishu]# sed '/welcome/y/.e/$a/' sedtxt
hello sed
walcoma to zaishu$cn walcoma to zaishu$cn  //把.e换成 $a
walcoma to zaishu$cn walcoma to zaishu$cn

5.保存内容脚本 w

将文本中指定行的内容写入文件中,此命令语法如下:
[address]/w filename

例1. 将全文保存到另一个文本

[root@prometheus zaishu]# sed 'w test2' test
abchello world
abc helloabc abc
abc abchelloabc abc
edf
ghi
dba hello
[root@prometheus zaishu]# cat test2 
abchello world
abc helloabc abc
abc abchelloabc abc
edf
ghi
dba hello
或者-n 仅另存文本,不做输出的动作
[root@prometheus zaishu]# sed -n 'w test3' test

例2. 指定行号

保存1-3的内容到其他文本

[root@prometheus zaishu]# sed '1,3w test4' test
abchello world
abc helloabc abc
abc abchelloabc abc
edf
ghi
dba hello
[root@prometheus zaishu]# cat test4 
abchello world
abc helloabc abc
abc abchelloabc abc

例3.正则表达式匹配行

将以abc开头的行保存到一个文本
**[root@prometheus zaishu]# sed '/^abc/w abc.txt' test
abchello world
abc helloabc abc
abc abchelloabc abc
edf
ghi
dba hello
[root@prometheus zaishu]# cat abc.txt 
abchello world
abc helloabc abc
abc abchelloabc abc**

6.插入其他文本 r

将一个文件的数据插入到当前指定位置。
语法:
[address]/r filename
将文件中的内容插入到 指定行后。

例1. 指定到某行后 插入内容

[root@prometheus zaishu]# cat append.txt 
add line
2 add line
[root@prometheus zaishu]# sed '2r append.txt' abc.txt
abchello world
abc helloabc abc
add line
2 add line
abc abchelloabc abc

例2.添加到最后行
指定文件中的数据插入到文本末尾,使用 $ 地址符

[root@prometheus zaishu]# sed '$r append.txt' abc.txt 
abchello world
abc helloabc abc
abc abchelloabc abc
add line
2 add line

例3.正则表达式匹配行
所有abc开头的行下面都插入这个文本内容

[root@prometheus zaishu]# sed '/^abc/r append.txt' abc.txt
abchello world
add line
2 add line
abc helloabc abc
add line
2 add line
abc abchelloabc abc
add line
2 add line

6.中断退出脚本命令 q

q命令: 遇到q表示退出sed程序。退出前会使用 p 命令输出模式缓冲区中的数据和清空模式缓冲区。
语法:
[address]/q

例1. 指定行号退出

输出前两行,第三行退出sed程序
[root@prometheus zaishu]# sed '2 q' abc.txt
abchello world
abc helloabc abc

例2. 通过正则表达式匹配退出行

输出world结尾的行,下一行退出sed程序

[root@prometheus zaishu]# sed '/world$/q' abc.txt
abchello world

脚本命令当中的地址[address]

[address]脚本命令
介绍脚本命令时,没有详解介绍 address使用。对上面的脚本命令来说,都可以使用address。选取指定的范围做sed操作,没有使用address 默认就是对全文。

地址表示的方法有以下 3 种:

  1. 以数字形式指定行区间
以数字形式指定行区间
n	n为行号
m,n	表示行号从m到n
  1. 用文本模式指定具体行区间,支持正则表达式匹配。
/pattern	查询包含模式的行
/pattern /pattern	查询包含两个模式的行
pattern/,x	在给定行号上查询包含模式的行
  1. 正则表达式
    正则表达式的语法可以参照上一节,在地址中也是支持通过正则表达式匹配要处理的行
x,y!	例如查询不包含指定行号x和y的行

例1. 指定行号

修改地址指定的第一行内容。

[root@prometheus zaishu]# sed '1s/hello/hi/' abc.txt 
abchi world
abc helloabc abc
abc abchelloabc abc

例2. 指定多行

使用行地址区间,修改1和2行
[root@prometheus zaishu]# sed '1,2s/hello/hi/' abc.txt 
abchi world
abc hiabc abc
abc abchelloabc abc

**例3. 指定到文档末尾 **
$ : 表示结尾。 如下表示从第3行到文档结尾。

[root@prometheus zaishu]# sed '3,$s/hello/hi/' test
abchello world
abc helloabc abc
abc abchiabc abc
edf
ghi
dba hi

例4. 用文本模式指定行区间
地址可以用文本模式来过滤指定的行:/pattern/command
对包含prometheus的行中内容进行替换。

[root@prometheus zaishu]# grep 'prometheus' /etc/passwd
prometheus:x:998:996::/home/prometheus:/bin/bash
[root@prometheus zaishu]# sed '/prometheus/s/bin/sbin/' /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
..
prometheus:x:998:996::/home/prometheus:/sbin/bash
..

正则表达式

sed 允许在[address]中可以使用正则表达式来进行复杂的数据匹配。

[root@zaishu zaishu]# cat sedtxt
hello sed
#welcome to zaishu.cn welcome to zaishu.cn
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin

welcome to zaishu.cn welcome to zaishu.cn

例1. 打印不以# 开头的行

[root@zaishu zaishu]# sed -n '/^#/p' sedtxt  //输出以#开头的行
#welcome to zaishu.cn welcome to zaishu.cn


[root@zaishu zaishu]# sed -n '/^#/!p' sedtxt  //打印不以#开头的行
hello sed
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin

welcome to zaishu.cn welcome to zaishu.cn

例2. 打印非空白行

[root@zaishu zaishu]# sed -n '/^$/p' sedtxt  //打印空白行
[root@zaishu zaishu]# sed -n '/^$/!p' sedtxt	//打印非空白行
hello sed
#welcome to zaishu.cn welcome to zaishu.cn
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
welcome to zaishu.cn welcome to zaishu.cn

例3.多层匹配,在不以#开头且非空的这些行中,替换nologin为login

首先找不以#开头的内容,再从这些内容中去掉空白行,然后对这些内容做替换的动作。

[root@zaishu zaishu]# sed '/^#/!{/^$/!s/nologin/login/}' sedtxt
hello sed
#welcome to zaishu.cn welcome to zaishu.cn
ftp:x:14:50:FTP User:/var/ftp:/sbin/login
nobody:x:99:99:Nobody:/:/sbin/login

welcome to zaishu.cn welcome to zaishu.cn

sed [选项]

[root@zaishu~]# sed [选项] [脚本命令] 文件名

选项

含义

-e 脚本命令

该选项会将其后跟的脚本命令添加到已有的命令中。

-f 脚本命令文件

该选项会将其后文件中的脚本命令添加到已有的命令中。

-n

默认情况下,sed 会在所有的脚本指定执行完毕后,会自动输出处理后的内容,而该选项会屏蔽启动输出,需使用 print 命令来完成输出。

-i

此选项会直接修改源文件

-r :

支持延伸型正规表示法的语法。简而言之,想在正则表达式当中少用,就加-r

这一章节重点介绍 【选项】

1.sed -i 选项

sed -i 是直接对原文件修改,工作当中这个选项用的非常频繁。之前在讲sed的时候,都只是修改缓冲区的数据,原文件的数据不会变更。

查看原文件内容

[root@zaishu zaishu]# cat sedtxt
hello sed
#welcome to zaishu.cn welcome to zaishu.cn
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin

welcome to zaishu.cn welcome to zaishu.cn

修改原文件的行

[root@zaishu zaishu]# sed -i 's/zaishu/zs/g' sedtxt  //将zaishu替换成zs
[root@zaishu zaishu]# cat sedtxt
hello sed
#welcome to zs.cn welcome to zs.cn
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
welcome to zs.cn welcome to zs.cn

删除原文件的行

[root@zaishu zaishu]# sed -i '2d' sedtxt  //删除第二行
[root@zaishu zaishu]# cat sedtxt
hello sed
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
welcome to zs.cn welcome to zs.cn

** 替换指定文件当中的字符**

[root@zaishu zaishu]# sed  -i '3y/y:/a&/' sedtxt    //将文本当中第三行的y替换成a :替换成& 
[root@zaishu zaishu]# cat sedtxt
hello sed
ftp:x:14:50:FTP Usar:/var/ftp:/sbin/nologin
noboda&x&99&99&Noboda&/&/sbin/nologin
welcome to zs.cn welcome to zs.cn

2. sed -e选项

当命令脚本有多条的时候,可以使用-e 指定多条命令脚本。

-e : 可以在同一行里执行多条命令
[root@zaishu zaishu]# sed -e 's/zaishu/zs/g' -e 's/nologin/login/g' sedtxt
hello sed
#welcome to zs.cn welcome to zs.cn
ftp:x:14:50:FTP User:/var/ftp:/sbin/login
nobody:x:99:99:Nobody:/:/sbin/login

welcome to zs.cn welcome to zs.cn

删除hello开头的行和空白行

[root@zaishu zaishu]# sed -e '/^hello/d' -e '/^$/d' sedtxt
#welcome to zaishu.cn welcome to zaishu.cn
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
welcome to zaishu.cn welcome to zaishu.cn

3.sed -f 选项

sed -f 这个选项用于将脚本命令放到单独文件,sed执行调用这个文件作为它的脚本命令。在脚本命令非常复杂的时候,这个选项很有用。

[root@zaishu zaishu]# cat sedtxt
hello sed
#welcome to zaishu.cn welcome to zaishu.cn
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin

welcome to zaishu.cn welcome to zaishu.cn
  1. 编辑规则文件
[root@zaishu zaishu]# cat rule.sed 
s/zaishu/zs/g
s/nologin/&gin/g
  1. 调用规则文件作为脚本命令
[root@zaishu zaishu]# sed -f rule.sed  sedtxt
hello sed
#welcome to zs.cn welcome to zs.cn
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologingin
nobody:x:99:99:Nobody:/:/sbin/nologingin

welcome to zs.cn welcome to zs.cn

4.sed -r 选项

sed -r 支持延伸型正规表示法的语法。简而言之,想在正则表达式当中少用,就加-r
例子 将10-19的数字替换成1

[root@zaishu zaishu]# echo 192.168.12.13|sed 's/1\+\([0-9]\+\)/\1/g' //不适用-r
92.68.2.3
[root@zaishu zaishu]# echo 192.168.12.13|sed -r 's/1+([0-9]+)/\1/g' //使用-r
92.68.2.3

-r这个选项了解即可,看个人习惯

总结


这节详细讲解sed的用法,也结合之前学过的正则表达式。这次文章完全从小白角度出发,花费了很长时间编辑,尽量让大家都能看懂和操作出来。文本处理还有个最强大的工具awk,后续单独出个专辑讲解。

友情链接

MySQL性能优化_原理_实战

1、MySQL在金融互联网行业的企业级安装部署

目录

章节

版本说明

版本说明

安装MySQL规范

1 安装方式

2 安装用户

3 目录规范


MySQL 5.7 安装部署

1 操作系统配置

2 创建用户

3 创建目录

4 安装

5 配置文件

6 安装依赖包

7 配置环境变量

8 初始化数据库

9 重置密码

MySQL8 安装

MySQL8 安装

源码安装

1 安装依赖包

2 生成源码包

3 创建用户

4 编译安装

5 配置数据库

6 连接mysql

多实例部署及注意事项

1 多实例概念

2 多实例安装

3 mysqld_multi(多实例第二种安装方式)

2、mysql启动关闭原理和实战_及常见错误排查

目录

章节

生产中MySQL启动方式

1、 启动原理

2、参数文件默认位置及优先级

3、 以server方式启动

4、 mysqld_safe方式

5、 mysqld 方式

6、 systemctl 方式

关库

1、相关参数innodb_fast_shutdown

2、相关参数innodb_force_recovery

3、关闭mysql多种方式

常见MySQL启动失败案例

1.、目录权限

2、参数问题

3、配置文件

4、端口占用

5、误删二进制文件

6、undo表空间异常

7、binlog缓冲异常

MySQL启动失败排查方法

MySQL启动失败排查方法

连接MySQL数据库的方式

连接MySQL数据库的方式

MySQL数据库用户安全策略


1、初始化数据库

2、修改密码

3、删除无用的用户

4、mysql_secure_installation

找回丢失的用户密码

找回丢失的用户密码

3、MySQL字符集和校对规则

目录

章节

MySQL字符集和校验规则

MySQL字符集和校验规则


查看字符集方法

1、查看mysql支持的字符集

2、查看字符集的校对规则

3、查看当前数据库的字符集

4、查看当前数据库的校对规则

MySQL字符集设置

1、字符集设置层级关系

2、设置MySQL服务器级别字符集

3、设置创建对象的字符集

字符集案例

1、常用字符集每个汉字占用字节多少

2、大小案例

插入中文乱码解决

插入中文乱码解决

数据库常见字符集及如何选择字符集

数据库常见字符集及如何选择字符集

生产中如何彻底避免出现乱码

生产中如何彻底避免出现乱码

4、史上最详细的Mysql用户权原理和实战_生产案例

目录

章节

访问控制

1、连接验证(阶段一)

2、允许的连接

3、连接优先级

4、请求验证(阶段二)

用户管理

1、新增用户

2、修改用户

3、删除用户

4、查看用户

密码管理

1、密码修改

2、密码过期设置

3、set password

4、密码过期策略

5、密码插件

MySQL用户权限管理

1、权限粒度

2、显示账户权限

3、显示账户非权限属性

4、库级权限

5、表级权限

6、列级权限

7、权限回收

资源限制

1、用户创建指定配额

2、修改配额

MySQL用户权限案例

1、断掉已清理的用户

2、忘记密码

3、如何禁止一个ip段的某个用户登录

4、创建开发账号

5、创建复制账号

6、创建管理员账号

5、InnoDB引擎原理和实战_通俗易懂

目录


章节

缓冲池

1、默认引擎

2、设置缓冲池大小

3、优化缓冲池

4、管理缓冲池

5、数据页类型

线程

1、IO线程

2、主线程

index page

index page

insert buffer page

insert buffer page

重做日志

重做日志

回滚日志

回滚日志

checkpoint,刷写脏页check point

checkpoint


关键特性

1、插入缓冲

2、数据写入可靠性提升技术-doublewrite

3、自适应哈希索引-AHI

innodb预读预写技术

预读写

6、MySQL文件详解_物理结构_逻辑结构_原理和案例

目录

章节

参数和配置文件

1、文件位置

2、查找参数

3、参数类型

4、参数修改

5、示例一

6、示例二

7、注意事项

错误日志文件

错误日志

通用日志

通用日志

慢查询日志

慢日志

binlog

1、记录什么

2、用途

3、开启和参数配置

4、日志查看

5、日志刷新

6、删除日志

7、日志分析(mysqlbinlog)

8、利用二进制日志文件恢复误删的表

InnoDB存储引擎表空间文件

表空间文件

主从同步相关文件

主从同步文件

套接字文件

套接字文件

pid 文件

pid 文件

redo log

1、redo初识

2、日志组

3、与oracle redo的区别

4、相关参数

5、和binlog的区别

6、redo 缓冲区(innodb_flush_log_at_trx_commit)

InnoDB存储引擎逻辑结构

1、表空间

2、段

3、区

4、页

表碎片清理

1、判断是否有碎片

2、整理碎片

表空间文件迁移


1、需求

2、操作

7、SQL编程开发与优化事项

目录

章节

常用语句

1、导入数据

2、库操作

3、表操作

4、数据操作

5、use性能影响

6、delete、truncate、drop的区别

7、SQL语句分类

数据类型与性能

1、整型

2、浮点型

3、字符串类型

4、日期类型

MySQL约束

1、unsigned/signed

2、not null

3、count(*) 为什么慢

4、default

5、unique

6、 auto_increment

7、primary key

SQL编程高级

1、查询Syntax

2、查询列

3、where子句

4、group by … having子句

5、order by子句

6、limit子句(分页)

7、聚合函数

8、合并查询

9、多表查询

10、子查询

表的元数据库管理

1、统计应用库哪些表没有使用innodb存储引擎

2、如何查看表中是否有大对象

3、统计数据库大小

4、统计表的大小

8、MySQL索引原理和案例

目录

章节

MySQL索引与二分查找法


1、什么是索引

2、索引的优缺点

3、索引的最大长度

4、二分查找法:折半查找法

5、mysql一张表存多少数据后,索引性能就会下降?

剖析b+tree数据结构

1、B和B+树的区别

2、索引树高度

3、非叶子节点

4、指针

5、叶子节点

6、双向指针

7、b+tree插入操作

8、b+tree删除操作

相辅相成的聚集索引和辅助索引

1、聚集索引

2、聚集索引特点

3、聚集索引的优势

4、辅助索引

覆盖索引与回表查询

1、回表查询

2、覆盖索引

创建高性能的主键索引

1、主键索引创建的原则

2、主键索引的特点

3、为什么建议使用自增列作为主键

唯一索引与普通索引的性能差距

1、唯一索引特点

2、普通索引特点

3、唯一索引与普通索引的性能差距

前缀索引带来的性能影响

1、作用

2、坏处

如何使用联合索引

1、什么是联合索引

2、创建原则

3、排序

Online DDL影响数据库的性能和并发

1、5.6版本之前

2、新版本

3、online ddl语法

4、相关参数

5、示例

6、影响

pt-ocs原理与应用

1、安装pt-osc

2、pt-osc语法

3、案例

4、pt-osc原理

生产中索引的管理

1、建表时创建索引

2、建表后创建索引

3、查看索引

SQL语句无法使用索引的情况

1、where条件

2、联合索引

3、联表查询

4、其他情况

9、information_schema和sys中性能查看

目录

章节

最常用的STATISTICS和TABLES

1、STATISTICS:用于存放索引的信息

2、TABLES:用于存放库表的元数据信息

判断索引创建是否合理

1、选择性

2、索引创建的建议

检查联合索引创建是否合理

1、联合索引创建是否合理

2、有了联合索引(a,b),还需要单独创建a索引吗?

如何查找冗余索引

查找冗余索引

查找产生额外排序的sql语句

额外排序的sql语句

查找产生临时表的sql语句

临时表的sql语句

全表扫描的sql语句

全表扫描的sql语句

统计无用的索引

无用的索引

索引统计信息

1、存储索引统计信息

2、如何查看索引统计信息

10、MySQL优化器算法与执行计划

目录

章节

简单嵌套查询算法-simple nested-loop join

simple nested-loop join

基于索引的嵌套查询算法-index nested-loop join

index nested-loop join

基于块的嵌套查询算法- block nested-loop join

block nested-loop join

Multi-Range Read

MRR

bached key access join

BKA

mysql三层体系结构

体系结构

Index Condition Pushdown

索引条件下推

一条查询SQL语句是怎样运行的

查询SQL语句

一条更新SQL语句是怎样运行的

更新SQL语句

MySQL长连接与短连接的选择

1、相关参数

2、断开连接

执行计划explain

1、语法

2、执行计划解析

11、MySQL查询优化

目录

章节


MySQL查询优化技术

概览

子查询优化

1、优化器自动优化

2、优化措施:子查询合并

3、优化措施:子查询上拉技术

外连接消除

外连接消除

生产环境不使用join联表查询

不使用join

group by分组优化

1、group by执行流程

2、为什么group by要创建临时表

order by排序优化

排序优化

MySQL性能抖动问题

性能抖动问题

count(*)优化

count(*)优化

磁盘性能基准测试

1、安装sysbench

2、生成文件

3、测试文件io

4、清除文件

MySQL基准测试


1、生成数据

2、测试(读)

3、测试(写)

4、清理数据

12、事务原理和实战

目录

章节

认识事务

认识事务

事务控制语句

1、开启事务

2、事务提交

3、事务回滚

事务的实现方式

1、原子性

2、一致性

3、隔离性

4、持久性

purge thread线程

purge thread线程

事务统计QPS与TPS

1、QPS

2、TPS

事务隔离级别

1、隔离级别

2、查看隔离级别

3、设置隔离级别

4、不同隔离级别下会产生什么隔离效果

事务组提交group commit

组提交

事务两阶段提交

两阶段提交

MVCC多版本并发控制

1、MVCC原理

2、MVCC案例

13、锁的原理和应用

目录

章节

认识锁

1、锁的作用

2、加锁的过程

3、锁对象:事务

innodb行锁

1、行锁类型

2、共享锁(S锁)

3、排他锁(X锁)

索引对行锁粒度的影响

1、行锁粒度有哪些

2、在RC隔离级别下不同索引产生的锁的范围

3、RR隔离级别下不同索引产生锁的范围

FTWRL全局读锁

FTWRL全局读锁

innodb表锁

innodb表锁

innodb意向锁与MDL锁

1、意向锁

2、意向锁作用

3、意向锁冲突情况

4、MDL锁

自增锁

自增锁

插入意向锁

插入意向锁

死锁

1、什么是死锁

2、相关参数

3、避免死锁

4、锁的状态

两阶段锁协议

两阶段锁协议

14、慢查询原理和实战_快速优化方法_优化工具

目录

章节

1. 系统状态

show status

2. 慢查询

2.1 慢查询开启

2.2 简单示例

2.3 数据准备

3. mysqldumpslow

3.1 语法

3.2 常见用法

4. pt-query-digest

4.1 安装

4.2 语法选项

4.3 报告解读

4.4 用法示例

5. 优化工具(soar)

5.1 安装配置

5.2 添加数据库

5.3 语句优化

15、备份恢复原理和实战_逻辑备份_物理备份_金融行业备份还原脚本

目录

章节

1.生产中备份方式

1.1 物理备份与逻辑备份

1.2 联机与脱机备份

1.3 完整备份与增量备份

1.4 常用命令

2.mysqldump备份

2.1 相关参数

2.2 备份所有数据库

2.3 备份指定数据库

2.4 备份指定表

2.6 只导出结构

2.7 只导出数据

2.8 --tab(生成文本,类似load)

2.8 mysqldump原理

2.9 binlog异步备份

2.10 利用mysqldump全备及binlog恢复数据

3.xtrabackup

3.1 Xtrabackup安装

3.2 原理

3.2 备份过程

3.4 恢复原理

3.3 相关参数

3.4 xtrabackup相关文件

3.5 备份示例

3.6 还原示例

4.binlog备份和恢复(数据库恢复)

4.1 找到恢复时间点

4.2 增量恢复

5. 生产环境的备份恢复实战

5.1 实施部署

5.1.1 环境清单

5.1.2 备份目的

5.1.3 备份说明

5.1.4 实施步骤

5.1.5 全备脚本

5.1.6 差异备份脚本

5.2 实施部署备份还原

5.2.1 Xtraback还原全量/差异备份

5.2.2 故障点数据恢复

5.2.3 增量恢复

16、主从复制,gtid,并行复制_半同步复制_实操案例_常用命令_故障处理

目录

章节

1.认识主从复制

1.1 主从复制原理深入讲解

1.2 主从复制相关参数

1.3.主从复制架构部署

1.4从库状态详解

1.5 .过滤复制

2 .gtid复制

2.1 什么是GTID?

2.2 GTID主从配置

2.5 gtid维护

2.4 GTID的特点

2.3 工作原理

2.4 gtid相关状态行和变量

3. 并行复制

3.1 延迟的原因

3.2 并行复制设置

3.3 查看并行复制

4. 增强半同步复制

4.1 异步复制

4.2 半同步复制

4.3 增强半同步复制

4.4 配置增强半同步

5. 案例

5.1 主库删除操作导致sql线程关闭案例

5.2 主从复制中断解决方案及案例

5.3 延迟复制

5.4 主库drop误操作利用延迟复制恢复案例

6 常用命令

6.1 启动线程

6.2 关闭线程

6.3 查看

6.4 重置

6.5 主从数据一致性校验

17、MySQL高可用和读写分离架构MHA

目录

章节

MHA

介绍

架构和相关组件

架构和相关组件

工作流程

工作流程

MHA高可用架构部署

1、环境准备

2、软件安装

3、创建软链接

4、配置各节点互信

5、节点免密验证

6、mha管理用户

7、配置文件

8、状态检查

9、开启MHA

主库宕机故障模拟及处理

主库宕机故障模拟及处理

MHA VIP自动切换

VIP自动切换

MHA主从数据自动补足

MHA主从数据自动补足

Atlas

目录

章节

Atlas读写分离高性能架构

介绍

安装配置

安装配置

配置注解

配置注解

启动和关闭

启动和关闭

读写分离架构应用

读写分离架构应用

创建应用用户

创建应用用户

Atlas在线管理

Atlas在线管理

读写分离避坑指南

读写分离避坑指南

18、MySQL分库分表_原理实战

目录

章节

1.MyCAT分布式架构入门及双主架构

1.1 主从架构

1.2 MyCAT安装

1.3 启动和连接

1.4 配置文件介绍

2.MyCAT读写分离架构

2.1 架构说明

2.2 创建用户

2.3 schema.xml

2.4 连接说明

2.5 读写测试

2.6 当前是单节点

3.MyCAT高可用读写分离架构

3.1 架构说明

3.3 schema.xml(配置)

3.4 文件详解

3.4.1 schema标签

3.4.2 table标签

3.4.3 dataNode标签

3.4.4 dataHost

3.4 读写测试

3.5 故障转移

4.MyCAT垂直分表


4.1 架构

4.2 新建表

4.3 配置mycat

4.4 验证

5 MyCAT水平分表-范围分片

5.1 新建表

5.2 schema.xml

5.2 rule.xml

5.3 autopartition-long.txt

5.4 验证

6. MyCAT水平分表-取模分片


取模分片

7. MyCAT水平分表-枚举分片

枚举分片

8. MyCAT全局表与ER表

全局与ER表

8.1 全局表

8.1.1 特性

8.1.2 建表

8.1.3 配置

8.1.4 验证

8.1.5 分析总结(执行计划)

8.2 ER表

8.2.1 特性

8.2.2 建表

8.2.3 配置

8.2.4 测试验证,子表是否跟随父表记录分片

8.2.5 分析总结(执行计划)

19、基准性能测试_sysbench

目录

章节

1. sysbench

1.1 用途

1.2 安装

1.3 版本

1.4 查看帮助

1.5 测试过程阶段

2 CPU 性能测试

2.1 测试原理

2.2 查看帮助

2.3 测试

3. 内存性能测试

3.1 查看帮助信息

3.2 测试过程

4.磁盘性能基准测试

4.1 查看帮助

4.2 生成文件(prepare)

4.3 测试文件io(run)

4.4 结果分析

4.5 清除文件(cleanup)

5. 线程测试

5.1 查看帮助信息

5.2 测试过程

6. MySQL基准测试

6.1 语法参数

6.2 生成数据

6.3 测试(读)

6.4 测试(写)

6.5 清理数据