三剑客与正则系列-sed命令

1.概述

  • 核心功能:取行,过滤,替换修改文件内容
  • 难点:后向引用(截取).
  • sed stream editor流编辑器.

2.格式

命令 选项 详细格式 参数
sed 选项 '条件动作' 文件
'找谁干啥'
找谁:条件,匹配哪一行,哪些行.
干啥:动作,增删改查.
#显示文件的第3行
sed -n '3p' /etc/passwd
选项 说明
-n 取消默认输出
-r sed支持扩展正则
-i 修改文件内容,这个选项放在最后.
-i.bak 先进行备份,然后修改文件内容.这个选项放在最后.

3.如何运行

image

4.sed增删改查之查找

一种是类似于grep模糊查找.

一种是精确查找,行号.

  • 类似于grep命令的过滤,比grep强在于可以指定行号.
  • 类似于grep命令的功能,模糊查询(通过正则).

案例01: 取出文件的第3行 ⭐⭐⭐⭐⭐

-n表示取消默认输出,sed处理文件的时候会默认的输出每一行内容.

sed  -n '3p' /etc/passwd

案例02: 取出/etc/passwd的第2行到第5行⭐⭐⭐⭐⭐

sed -n '2,5p' /etc/passwd

案例03: 过滤出/etc/passwd中包含root的行 ⭐⭐⭐⭐⭐

[root@myvps ~]# grep 'root' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@myvps ~]# sed  -n '/root/p' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@myvps ~]# sed -n '/^root/p' /etc/passwd
root:x:0:0:root:/root:/bin/bash

⚠ 注意

sed进行过滤的时候需要使用 并且里面支持基础正则

如果需要使用扩展正则需要使用sed -r选项

案例04: 获取范围内的日志 ⭐⭐⭐⭐⭐

cat >/oldboy/sed.txt<<EOF
101,oldboy,CEO
102,bigbao,CTO
103,李导996,COO
104,yy,CFO
105,feixue,CIO
110,lidao,COCO
EOF
[root@myvps ~]# sed -n '/102/,/105/p' /oldboy/sed.txt 
102,bigbao,CTO
103,李导996,COO
104,yy,CFO
105,feixue,CIO

image

[root@myvps ~]# sed -n '/102/,/105/p' /oldboy/sed.txt 
102,bigbao,CTO
103,李导996,COO
104,yy,CFO
105,feixue,CIO
[root@myvps ~]# #sed -n '/10:00:00/,/11:00:00/p' /oldboy/sed.txt 

4.1 sed命令过滤/查找功能小结

  • 核心掌握:
    • 根据行号查找,模糊查找,模糊表示范围(日志)
    • 注意这里提到的指定行号,方式都表示条件(找谁),除了给p(查找)用,还可以给改,增加,删除.
  • 过滤的时候与grep类似支持正则表达式,sed -r支持扩展正则.

4.2 只显示第3行和第5行

sed -n '1p;5p' /etc/passwd

image

4.3 表示有规律的查找-了解

[root@myvps oldboy]# seq 10 |sed -n '1~2p' 
1
3
5
7
9
[root@myvps oldboy]# seq 10 |sed -n '2~2p' 
2
4
6
8
10

4.4 sed增删查改查之修改

  • sed的修改叫做替换.

(案例05): 把sed.txt文件中lidao替换为oldboy

image

sed命令的替换格式说明:

sed 's#找谁#替换成什么#g' sed.txt

sed 's###g' sed.txt

推荐使用: ### , /// , @@@

s substitute 替换 sub

g global 全局替换,这一行中把所有匹配到的内容都进行替换,否则只替换每一行第1个匹配的内容

  • 修改文件内容

image

sed命令替换的时候 s###g

也可以写为 s@@@g s///g

  • 修改文件内容之前进行备份,然后修改文件内容
sed -i.bak 's#bigbao#oldbao#' /oldboy/sed.txt
-i后面可以加上一些额外的内容 -i.bak 

表示先对sed.txt进行备份 sed.txt.bak
然后对文件内容进行替换
一般用于替换某一个文件,如果是多个文件就打包压缩进行备份即可

[root@myvps ~]# ll /oldboy/sed.*
-rw-r--r-- 1 root root 90 3月   3 13:44 /oldboy/sed.txt
-rw-r--r-- 1 root root 90 3月   3 13:37 /oldboy/sed.txt.bak

4.5 增删改查之替换-进阶

(1)后向引用格式

应用说明:

后向引用或反向引用: 适用于sed命令处理/提取一行中的某一部分.sed命令配合正则实现取列.(类似于awk取列)

sed命令中用于处理列的方式.

使用格式:

使用替换的形式 s###g

前2个井号之间通过正则与(),对数据进行分组.

后面2个井号之间通过\数字,去调用前面分组的内容.

整体是后面调用前面分组的内容,称之为反向引用/后向引用.

应用场景: 某一行中对部分数据进行加工与处理,提取某一部分数据

  • 例子
输出12345678,通过sed加工变成1<234567>8
[root@myvps ~]# echo  12345678 |sed -r 's#(1)(.*)(8)#\1#g'
1
[root@myvps ~]# echo  12345678 |sed -r 's#(1)(.*)(8)#\2#g'
234567
[root@myvps ~]# echo  12345678 |sed -r 's#(1)(.*)(8)#\3#g'
8
[root@myvps ~]# echo  12345678 |sed -r 's#(1)(.*)(8)#<\2>#g'
<234567>
[root@myvps ~]# echo  12345678 |sed -r 's#(1)(.*)(8)#\1<\2>\3#g'
1<234567>8

案例01: 调换/etc/passwd第1列和最后一列内容

cp /etc/passwd . 
  • 匹配第1组

image

  • 匹配第2组

image

image

  • 匹配第3组

image

image

  • 输出最后结果:
sed  -r  's#^(.*)(:x.*:)(.*$)#\3\2\1#g' passwd 
^([a-zA-Z0-9_-]+)(:.*:)(/.*)$

案例02: 取出网卡ip地址

ip a s eth0取出第3行里面的ip地址
方法01 
[root@myvps ~]# ip a s eth0 |sed -n '3p' | sed -r 's#^.*et ([0-9.]+)/.*$#\1#g'
10.0.0.200


方法02 进阶
 sed -n '3p'
 + 
 sed -r 's#^.*et ([0-9.]+)/.*$#\1#g'
 ---------------------------------------
 = sed -nr '3 s#^.*et ([0-9.]+)/.*$#\1#g p'
 
 方法03 awk 
 [root@myvps ~]# ip a s eth0 | sed -n '3p' |awk '{print $2}' |sed 's#/24##g'
10.0.0.200
方法04  awk
 [root@myvps ~]# ip a s eth0 | sed -n '3p' |awk -F "[ /]+" '{print $3}'
10.0.0.200
方法05-06 awk
ip a s eth0 | sed -n '3p' |awk -F "[ /]+" '{print$3}'

 [root@myvps ~]# ip a s eth0 | awk -F "[ /]+" 'NR3{print $3}'
10.0.0.200

方法07
hostname -I

目前核心掌握第1种,awk后掌握awk方法

案例03: 取出stat /etc/hosts中的0644或644

[root@myvps ~]# stat /etc/hosts |sed -n '4p' | sed -r 's#^.*\(([0-9]+)/.*$#\1#g'

image

4.6 增删改查之删除

  • d delete 删除sed命令删除功能按照 为单位进行.
  • 如果仅仅删除某一行的一些字符推荐使用's#[a-z]##g'
# sed  '3d' sed.txt
101,oldboy,CEO
102,oldbao,CTO
104,yy,CFO
105,feixue,CIO
110,oldboy,COCO
  • 排除/删除文件中的空行和带注释的行
egrep  -v '^$|#' /etc/ssh/sshd_config
sed -r '/^$|#/d' /etc/ssh/sshd_config
awk  '! /^$|#/' /etc/ssh/sshd_config

sed -nr '/^$|#/!p' /etc/ssh/sshd_config

4.7 增删改查之增加

  • cai
    • a append 在指定行后面追加内容
    • i insert 在指定行上面插入一行
    • c replace 替换指定行的内容
[root@myvps oldboy]# sed '3a lidao996' sed.txt
101,oldboy,CEO
102,oldbao,CTO
103,李导996,COO
lidao996
104,yy,CFO
105,feixue,CIO
110,oldboy,COCO
[root@myvps oldboy]# cat sed.txt
101,oldboy,CEO
102,oldbao,CTO
103,李导996,COO
104,yy,CFO
105,feixue,CIO
110,oldboy,COCO
[root@myvps oldboy]# sed '3i lidao996' sed.txt
101,oldboy,CEO
102,oldbao,CTO
lidao996
103,李导996,COO
104,yy,CFO
105,feixue,CIO
110,oldboy,COCO
[root@myvps oldboy]# sed '3c lidao996' sed.txt
101,oldboy,CEO
102,oldbao,CTO
lidao996
104,yy,CFO
105,feixue,CIO
110,oldboy,COCO

image

posted @   殇ベ墨~  阅读(4)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示