Linux sed使用方法

目录


  1. sed处理流程
  2. 测试数据
  3. sed命令格式
  4. sed命令行格式
  5. 行定位
    1. 定位1行
    2. 定位区间行(多行)
    3. 定位某一行之外的行
    4. 定位有跨度的行
  6. 操作命令
    1. -a (新增行)
    2. -i(插入行)
    3. -c(替代行)
    4. -d(删除行)
    5. -s(替换行中的部分内容)
  7. sed使用案例
  8. 高级sed操作
    1. { }多个sed命令
    2. {n;p}跳行打印
    3. &单一反向引用
    4. -r 复制指定文件,插入到匹配行
    5. -w  复制匹配行,拷贝到指定文件中
    6. -q 退出sed
    7. \(  \) 多个反向引用

处理流程

  sed(流处理编辑器),处理文本的过程如下:

  1、从文本或者管道中读入一行内容到模式空间(临时缓冲区)

  2、使用sed命令处理,重复第1步,直到文件处理完毕

  3、输出到屏幕

  注意两点:

  1、sed一次处理一行的内容

  2、sed默认的不改变文件内容

测试数据

  

[root@localhost test]# cat -n data.txt
1 小红 女 20 BeiJing China
2 小明 男 22 ChongQing China
3 花花 女 30 HeBei China
4 Jane 女 29 Los Angeles America
5 Maecheal 男 30 Washington America
6 山本 男 25 Nagasaki Japan
7 村上春树 男 40 Hiroshima Japan
8 贝爷 男 35 Paris Franch

  

使用sed的格式

  命令行格式:将包含sed的命令写在命令行中执行

$ sed [options] 'command' files

  

  脚本格式:将sed的命令写在一个脚本中,然后执行的时候,指定sed脚本的路径即可

$ sed -f scriptfile files

  上面这两个命令中,files都是要进行处理的文件。

命令行格式

$sed [options] 'command' files

  options可以使用下面这几个值:

    -e:可以指定多个command

    -n:与p(print)命令合用时,表示只显示被选中的行,而不是显示所有的行,然后被选中的行会显示两次。

    -i:将sed的操作结果更新到文件中,因为默认的是不会操作文件本身的。

  command:行定位(正则)+ sed命令,首先会通过正则行定位,选中要进行操作的行,然后执行sed命令

行定位

  选择1行,可以使用两种方式:

    1、n;    选中1行,n表示行号

    2、/pattern/  使用正则表达式,注意要包含在/..../之间

[root@localhost test]# #打印第5行
[root@localhost test]# sed -n "5 p" data.txt
Maecheal 男 30 Washington America [root@localhost test]# #打印匹配"China"的记录
[root@localhost test]# sed -n "/china/ p" data.txt
[root@localhost test]# sed -n "/China/ p" data.txt
小红 女 20 BeiJing China
小明 男 22 ChongQing China
花花 女 30 HeBei China

  

  选择多行,同样有两种方式:

    1、x,y;    选中行号在x~y之间的行

    2、/pattern1/, /pattern2/    选择匹配两个正则表达式之间的行

[root@localhost test]# #打印第3~6行
[root@localhost test]# cat -n data.txt | sed -n "3,6 p"
3 花花 女 30 HeBei China
4 Jane 女 29 Los Angeles America
5 Maecheal 男 30 Washington America
6 山本 男 25 Nagasaki Japan [root@localhost test]# #打印“Jane”的行,到“贝爷”之间的行
[root@localhost test]# sed -n "/Jane/, /贝爷/ p" data.txt
Jane 女 29 Los Angeles America
Maecheal 男 30 Washington America
山本 男 25 Nagasaki Japan
村上春树 男 40 Hiroshima Japan
贝爷 男 35 Paris Franch

    

  不选择某一行或者某几行

    在后面加 ! 即可

[root@localhost test]# #打印除了第4行以外的所有行
[root@localhost test]# cat -n data.txt | sed -n "4! p"
1 小红 女 20 BeiJing China
2 小明 男 22 ChongQing China
3 花花 女 30 HeBei China
5 Maecheal 男 30 Washington America
6 山本 男 25 Nagasaki Japan
7 村上春树 男 40 Hiroshima Japan
8 贝爷 男 35 Paris Franch [root@localhost test]# #打印除3-7行之外的行
[root@localhost test]# cat -n data.txt | sed -n "3,7! p"
1 小红 女 20 BeiJing China
2 小明 男 22 ChongQing China
8 贝爷 男 35 Paris Franch

  

  间隔几行选择

    使用x~y格式,首先打印第x行,然后每个y行,就打印一次

[root@localhost test]# #打印第3行,之后,每隔2行,就打印一次
[root@localhost test]# cat -n data.txt | sed -n "3~2 p"
3 花花 女 30 HeBei China
5 Maecheal 男 30 Washington America
7 村上春树 男 40 Hiroshima Japan

  

操作命令

  sed有几个基本的操作命令,分别是下面几个:

  1、-a (append,添加,在行后追加)

  2、-i(insert,插入,在行前插入)

  3、-d(delete,删除行)

  4、-c(chage,替换)

  5、-s(subsitute,替换)

-a 增加行

  

[root@localhost test]# #在第3行后面增加一行“---------------”
[root@localhost test]# cat -n data.txt | sed "3a -------------"
1 小红 女 20 BeiJing China
2 小明 男 22 ChongQing China
3 花花 女 30 HeBei China
-------------
4 Jane 女 29 Los Angeles America
5 Maecheal 男 30 Washington America
6 山本 男 25 Nagasaki Japan
7 村上春树 男 40 Hiroshima Japan
8 贝爷 男 35 Paris Franch [root@localhost test]# #在3~5行的每一行后面加一行“==========”
[root@localhost test]# cat -n data.txt | sed "3,5a =========="
1 小红 女 20 BeiJing China
2 小明 男 22 ChongQing China
3 花花 女 30 HeBei China
==========
4 Jane 女 29 Los Angeles America
==========
5 Maecheal 男 30 Washington America
==========
6 山本 男 25 Nagasaki Japan
7 村上春树 男 40 Hiroshima Japan
8 贝爷 男 35 Paris Franch [root@localhost test]# #在每一行后面增加一行“===========”
[root@localhost test]# cat -n data.txt | sed "a =========="
1 小红 女 20 BeiJing China
==========
2 小明 男 22 ChongQing China
==========
3 花花 女 30 HeBei China
==========
4 Jane 女 29 Los Angeles America
==========
5 Maecheal 男 30 Washington America
==========
6 山本 男 25 Nagasaki Japan
==========
7 村上春树 男 40 Hiroshima Japan
==========
8 贝爷 男 35 Paris Franch
========== [root@localhost test]# #在行末增加一行“-------------------”
[root@localhost test]# sed '$a -------------------------' data.txt
小红 女 20 BeiJing China
小明 男 22 ChongQing China
花花 女 30 HeBei China
Jane 女 29 Los Angeles America
Maecheal 男 30 Washington America
山本 男 25 Nagasaki Japan
村上春树 男 40 Hiroshima Japan
贝爷 男 35 Paris Franch
-------------------------

  

-i 插入行

  -i插入行和增加行的操作一样,区别是a是在行之后增加,i是在行之前插入

[root@localhost test]# #在第3行之前增加一行“---------------”
[root@localhost test]# cat -n data.txt | sed "3i --------------"
1 小红 女 20 BeiJing China
2 小明 男 22 ChongQing China
--------------
3 花花 女 30 HeBei China
4 Jane 女 29 Los Angeles America
5 Maecheal 男 30 Washington America
6 山本 男 25 Nagasaki Japan
7 村上春树 男 40 Hiroshima Japan
8 贝爷 男 35 Paris Franch [root@localhost test]# #在第3~5行的每一行之前插入一行"==========="
[root@localhost test]# cat -n data.txt | sed "3,5i ==========="
1 小红 女 20 BeiJing China
2 小明 男 22 ChongQing China
===========
3 花花 女 30 HeBei China
===========
4 Jane 女 29 Los Angeles America
===========
5 Maecheal 男 30 Washington America
6 山本 男 25 Nagasaki Japan
7 村上春树 男 40 Hiroshima Japan
8 贝爷 男 35 Paris Franch
[root@localhost test]# #在每一行之前插入一行"==========="
[root@localhost test]# cat -n data.txt | sed "i ==========="
===========
1 小红 女 20 BeiJing China
===========
2 小明 男 22 ChongQing China
===========
3 花花 女 30 HeBei China
===========
4 Jane 女 29 Los Angeles America
===========
5 Maecheal 男 30 Washington America
===========
6 山本 男 25 Nagasaki Japan
===========
7 村上春树 男 40 Hiroshima Japan
===========
8 贝爷 男 35 Paris Franch

  

-c 替换行

  替换行,是指,将指定行,整行内容都替换为指定内容,注意-s是指替换行中的一部分内容。

  注意,区间替换的时候,是整体替换,而不是逐行替换。

[root@localhost test]# #将第2行替换为"hello shell"
[root@localhost test]# cat -n data.txt | sed "2c hello world"
1 小红 女 20 BeiJing China
hello world
3 花花 女 30 HeBei China
4 Jane 女 29 Los Angeles America
5 Maecheal 男 30 Washington America
6 山本 男 25 Nagasaki Japan
7 村上春树 男 40 Hiroshima Japan
8 贝爷 男 35 Paris Franch [root@localhost test]# #尝试将第2~5行的每一行都替换为"hello world",但是实际操作后会将2-5行整体替换
[root@localhost test]# cat -n data.txt | sed "2,5c hello world"
1 小红 女 20 BeiJing China
hello world
6 山本 男 25 Nagasaki Japan
7 村上春树 男 40 Hiroshima Japan
8 贝爷 男 35 Paris Franch [root@localhost test]# #将每一行都替换为“hello world”
[root@localhost test]# cat -n data.txt | sed "c hello world"
hello world
hello world
hello world
hello world
hello world
hello world
hello world
hello world

  

-d 删除行

[root@localhost test]# #删除第4行
[root@localhost test]# cat -n data.txt | sed "4d"
1 小红 女 20 BeiJing China
2 小明 男 22 ChongQing China
3 花花 女 30 HeBei China
5 Maecheal 男 30 Washington America
6 山本 男 25 Nagasaki Japan
7 村上春树 男 40 Hiroshima Japan
8 贝爷 男 35 Paris Franch [root@localhost test]# #删除第4-6行
[root@localhost test]# cat -n data.txt | sed "4,6d"
1 小红 女 20 BeiJing China
2 小明 男 22 ChongQing China
3 花花 女 30 HeBei China
7 村上春树 男 40 Hiroshima Japan
8 贝爷 男 35 Paris Franch [root@localhost test]# #删除所有行(无意义)
[root@localhost test]# cat -n data.txt | sed "d"

  

-s 替换行的部分内容

[root@localhost test]# #将字符a替换为X
[root@localhost test]# sed 's/a/X/' data.txt
小红 女 20 BeiJing ChinX
小明 男 22 ChongQing ChinX
花花 女 30 HeBei ChinX
JXne 女 29 Los Angeles America
MXecheal 男 30 Washington America
山本 男 25 NXgasaki Japan
村上春树 男 40 HiroshimX Japan
贝爷 男 35 PXris Franch

  注意,在替换的时候,只替换了一次,即只替换第一个匹配的内容。如果要将满足条件的内容都替换,就需要加上g

[root@localhost test]# sed 's/a/X/g' data.txt
小红 女 20 BeiJing ChinX
小明 男 22 ChongQing ChinX
花花 女 30 HeBei ChinX
JXne 女 29 Los Angeles AmericX
MXecheXl 男 30 WXshington AmericX
山本 男 25 NXgXsXki JXpXn
村上春树 男 40 HiroshimX JXpXn
贝爷 男 35 PXris FrXnch

  

sed使用案例

  1、在data文件的第8行下面增加一行“hello world”,并且hello world前面要有4个空格

[root@localhost test]# #测试1,直接输入4个空格,失败
[root@localhost test]# sed '8 a hello world' data.txt
小红 女 20 BeiJing China
小明 男 22 ChongQing China
花花 女 30 HeBei China
Jane 女 29 Los Angeles America
Maecheal 男 30 Washington America
山本 男 25 Nagasaki Japan
村上春树 男 40 Hiroshima Japan
贝爷 男 35 Paris Franch
hello world [root@localhost test]# #测试2,使用反斜线转义,成功
[root@localhost test]# sed '8 a \ hello world' data.txt
小红 女 20 BeiJing China
小明 男 22 ChongQing China
花花 女 30 HeBei China
Jane 女 29 Los Angeles America
Maecheal 男 30 Washington America
山本 男 25 Nagasaki Japan
村上春树 男 40 Hiroshima Japan
贝爷 男 35 Paris Franch
hello world

  

  2、删除demo.txt文件中的空行

[root@localhost test]# cat demo.txt
111111 22222 333333
44444
[root@localhost test]# sed '/^$/ d' demo.txt
111111
22222
333333
44444

  

  3、获取eth0网卡的ip

[root@localhost test]# ifconfig eth0
eth0 Link encap:Ethernet HWaddr 00:0C:29:21:0C:0F
inet addr:192.168.228.153 Bcast:192.168.228.255 Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:fe21:c0f/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:27644 errors:0 dropped:0 overruns:0 frame:0
TX packets:14175 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:22947297 (21.8 MiB) TX bytes:1135056 (1.0 MiB) [root@localhost test]# ifconfig eth0 | sed -n '/inet addr:/ p'
inet addr:192.168.228.153 Bcast:192.168.228.255 Mask:255.255.255.0 [root@localhost test]# ifconfig eth0 | sed -n '/inet addr:/ p' | sed 's/.*inet addr://'
192.168.228.153 Bcast:192.168.228.255 Mask:255.255.255.0 [root@localhost test]# ifconfig eth0 | sed -n '/inet addr:/ p' | sed 's/.*inet addr://' | sed 's/B.*$//'
192.168.228.153

  

高级sed操作

  包括以下内容:

    1、{command1; command2; command 3}多个sed命令,使用“;”分开

    2、n表示跳1行

    3、&表示前面已经匹配的字符串内容,反向引用,不用再写一次正则表达式

      

多个sed命令

  使用花括号{   }将多个sed命令包含在一起,多个sed之间用;分开

[root@localhost test]# cat -n data.txt
1 小红 女 20 BeiJing China
2 小明 男 22 ChongQing China
3 花花 女 30 HeBei China
4 Jane 女 29 Los Angeles America
5 Maecheal 男 30 Washington America
6 山本 男 25 Nagasaki Japan
7 村上春树 男 40 Hiroshima Japan
8 贝爷 男 35 Paris Franch
[root@localhost test]# cat -n data.txt | sed '{3,5 d; s/China/Chinese/}'
1 小红 女 20 BeiJing Chinese
2 小明 男 22 ChongQing Chinese
6 山本 男 25 Nagasaki Japan
7 村上春树 男 40 Hiroshima Japan
8 贝爷 男 35 Paris Franch

  

跳行

  打印奇数行和偶数行

[root@localhost test]# #打印奇数行
[root@localhost test]# cat -n data.txt | sed -n '1~2 p'
1 小红 女 20 BeiJing China
3 花花 女 30 HeBei China
5 Maecheal 男 30 Washington America
7 村上春树 男 40 Hiroshima Japan
[root@localhost test]# cat -n data.txt | sed -n '{p; n}'
1 小红 女 20 BeiJing China
3 花花 女 30 HeBei China
5 Maecheal 男 30 Washington America
7 村上春树 男 40 Hiroshima Japan
[root@localhost test]#
[root@localhost test]# #打印偶数行
[root@localhost test]# cat -n data.txt | sed -n '2~2 p'
2 小明 男 22 ChongQing China
4 Jane 女 29 Los Angeles America
6 山本 男 25 Nagasaki Japan
8 贝爷 男 35 Paris Franch
[root@localhost test]# cat -n data.txt | sed -n '{n; p}'
2 小明 男 22 ChongQing China
4 Jane 女 29 Los Angeles America
6 山本 男 25 Nagasaki Japan
8 贝爷 男 35 Paris Franch

  可以使用多个n来进行跳过

&反向引用

  &表示前面已经匹配的字符串内容,反向引用,不用再写一次正则表达式

  在男或者女之前加一个gender单词

[root@localhost test]# cat -n data.txt | sed 's/[男|女]/gender:[男|女]/'
1 小红 gender:[男|女] 20 BeiJing China
2 小明 gender:[男|女] 22 ChongQing China
3 花花 gender:[男|女] 30 HeBei China
4 Jane gender:[男|女] 29 Los Angeles America
5 Maecheal gender:[男|女] 30 Washington America
6 山本 gender:[男|女] 25 Nagasaki Japan
7 村上春树 gender:[男|女] 40 Hiroshima Japan
8 贝爷 gender:[男|女] 35 Paris Franch
[root@localhost test]# cat -n data.txt | sed 's/[男|女]/gender:&/'
1 小红 gender:女 20 BeiJing China
2 小明 gender:男 22 ChongQing China
3 花花 gender:女 30 HeBei China
4 Jane gender:女 29 Los Angeles America
5 Maecheal gender:男 30 Washington America
6 山本 gender:男 25 Nagasaki Japan
7 村上春树 gender:男 40 Hiroshima Japan
8 贝爷 gender:男 35 Paris Franch

  

  案例1:将data.txt中的所有字母都变为大写

[root@localhost test]# cat -n data.txt
1 小红 女 20 BeiJing China
2 小明 男 22 ChongQing China
3 花花 女 30 HeBei China
4 Jane 女 29 Los Angeles America
5 Maecheal 男 30 Washington America
6 山本 男 25 Nagasaki Japan
7 村上春树 男 40 Hiroshima Japan
8 贝爷 男 35 Paris Franch
[root@localhost test]# cat -n data.txt | sed 's/[A-Z]/\l&/g'
1 小红 女 20 beijing china
2 小明 男 22 chongqing china
3 花花 女 30 hebei china
4 jane 女 29 los angeles america
5 maecheal 男 30 washington america
6 山本 男 25 nagasaki japan
7 村上春树 男 40 hiroshima japan
8 贝爷 男 35 paris franch
[root@localhost test]# cat -n data.txt | sed 's/[a-z]/\u&/g'
1 小红 女 20 BEIJING CHINA
2 小明 男 22 CHONGQING CHINA
3 花花 女 30 HEBEI CHINA
4 JANE 女 29 LOS ANGELES AMERICA
5 MAECHEAL 男 30 WASHINGTON AMERICA
6 山本 男 25 NAGASAKI JAPAN
7 村上春树 男 40 HIROSHIMA JAPAN
8 贝爷 男 35 PARIS FRANCH

-r 复制指定文件插入到匹配行

[root@localhost test]# cat A.txt
111111
222222
333333
[root@localhost test]# cat B.txt
AAAAAAA
BBBBBBB
CCCCCCC

  

  将A.txt中的内容,插入到B.txt的第2行后面

[root@localhost test]# #将A.txt中的内容插入到B.txt中的第2行后面
[root@localhost test]# sed '2 r A.txt' B.txt
AAAAAAA
BBBBBBB
111111
222222
333333
CCCCCCC
[root@localhost test]# #将A.txt中的内容插入到B.txt中包含CCCCCC的行后面
[root@localhost test]# sed '/CCCCCC/ r A.txt' B.txt
AAAAAAA
BBBBBBB
CCCCCCC
111111
222222
333333
[root@localhost test]# #将A.txt中的内容插入B.txt中每一行的后面
[root@localhost test]# sed 'r A.txt' B.txt
AAAAAAA
111111
222222
333333
BBBBBBB
111111
222222
333333
CCCCCCC
111111
222222
333333

  

-w 复制匹配行,拷贝到指定文件中

  对于A.txt中选中的行,保存到文件B.txt中,会首先清空B.txt的内容,然后将选中的行拷贝出来,再保存到B.txt中。

[root@localhost test]# #将A.txt中的2-4行,写到C.txt中,注意会先清空C.txt
[root@localhost test]# sed '2,4 w C.txt' A.txt
111111
222222
333333
[root@localhost test]# cat C.txt
222222
333333

  

-q 提前退出sed

  sed的处理流程是:从文件中读入一行,然后sed处理一行,一直到文件结束为止。

  使用q,可以让sed提前结束,不用读到文件结束。

[root@localhost test]# #打印前3行
[root@localhost test]# sed '3 q' data.txt
小红 女 20 BeiJing China
小明 男 22 ChongQing China
花花 女 30 HeBei China
[root@localhost test]#
[root@localhost test]# #找到第1个Japan
[root@localhost test]# sed '/Japan/ q' data.txt
小红 女 20 BeiJing China
小明 男 22 ChongQing China
花花 女 30 HeBei China
Jane 女 29 Los Angeles America
Maecheal 男 30 Washington America
山本 男 25 Nagasaki Japan

  

\(  \)多次反向引用

  使用\1,\2,\3....\n表示前面的第n个子表达式

  获取所有用户,以及用户的UID和GID

[root@localhost test]# head -5 /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
[root@localhost test]# head -5 /etc/passwd | sed 's/^\([a-zA-Z_-]\+\):x:\([0-9]\+\):\([0-9]\+\):.*/USER:\1 \t UID:\2 GID:\3/'
USER:root UID:0 GID:0
USER:bin UID:1 GID:1
USER:daemon UID:2 GID:2
USER:adm UID:3 GID:4
USER:lp UID:4 GID:7

  

  获取eth0的ip地址

[root@localhost test]# ifconfig eth0
eth0 Link encap:Ethernet HWaddr 00:0C:29:21:0C:0F
inet addr:192.168.228.153 Bcast:192.168.228.255 Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:fe21:c0f/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:34864 errors:0 dropped:0 overruns:0 frame:0
TX packets:17848 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:23505959 (22.4 MiB) TX bytes:1547380 (1.4 MiB) [root@localhost test]# ifconfig eth0 | sed -n '/inet addr/ p' | sed 's/.*inet addr:\([0-9.]\+\).*/\1/'
192.168.228.153

  

上一篇:Nginx实现负载均衡的方式有哪几种呢?


下一篇:Nginx负载均衡中后端节点服务器健康检查的一种简单方式