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

news/2025/3/3 22:19:14/文章来源:https://www.cnblogs.com/liaofy/p/18749523

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_configsed -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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/893173.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

加速PyTorch模型训练技巧

Pytorch-Lightning 可以在Pytorch的库Pytorch-lightning中找到我们在这里讨论的每一个优化。Lightning是在Pytorch之上的一个封装,它可以自动训练,同时让研究人员完全控制关键的模型组件。Lightning使用最新的最佳实践,并将你可能出错的地方最小化。 我们为MINST定义为Light…

能力全面提升综合题单-练习

Part1 语言基础题 P1089 [NOIP 2004 提高组] 津津的储蓄计划import java.util.Scanner;// P1089 [NOIP 2004 提高组] 津津的储蓄计划 public class P1089 {public static void main(String[] args) {Scanner in = new Scanner(System.in);int[] budget = new int[12];for (int …

kettle插件-git/svn版本管理插件

场景:大家都知道我们平时使用spoon客户端的时候时无法直接使用git的,给我们团队协作带来了一些小问题,需要我们本机单独安装git客户端进行手动上传trans或者job。 我们团队成员倪老师开发了一款kettle的git插件,帮我们解决了这个大难题,大大方便了我们团队协作,今天一起来…

自我介绍,软工五问

作业相关信息这个作业属于哪个课程 https://edu.cnblogs.com/campus/gdgy/SoftwareEngineeringClassof2023这个作业要求在哪里 https://edu.cnblogs.com/campus/gdgy/SoftwareEngineeringClassof2023/homework/13325这个作业的目标 学习博客的使用自我介绍 我是软工2班的彭颂华…

HTTPS,TLS原理分析

简单介绍 Tansport Layer Security TLS 已经逐渐取代 SSL 可以简单理解:HTTPS = HTTP + SSL/TLS TLS运行在TCP之上,HTTP之下,传输层协议,负责HTTP内容的安全传输 TLS流程在TCP三次握手建立连接后开始 TLS协议结构wireshark中TLS主要分为两层,底层的是TLS记录协议,主要负责…

训练ai生成代码效果展示

训练ai生成代码效果展示 在本次实验中试图使用命令的形式来训练ai,达到成功获取需要的web开发页码的效果 起初 本来我打算让ai生成一个整体的项目,但是ai不可以直接生成一整块的项目,他也没办法把得到的结果以文件的形式传给你,得到的还是文本,第一实验的结果并不理想 以下是训…

公交线路(迪杰斯特拉)

这道题就是一道迪杰斯特拉的板子,没想到的是我想到了重载小于符号,没想到要定义优先队列 #include<iostream> #include<vector> #include<queue> #include<cstring> using namespace std; const int N=1000+5; struct node{int id,dis; }; vector<…

HDFS中数据目录的挂载在根目录下至磁盘爆满问题解决

1、查看hdfs-size.xml文件 获取数据目录位置vim /opt/hadoop/etc/hadoop/hdfs-site.xml<property> <name>dfs.datanode.data.dir</name> <value>/home/hadoop-data/data-node-data,/home/hadoop-data/data-node-data-2,/data-3</value> </pro…

下载及安装

进入官网https://www.docker.com/ 直接在浏览器下载会比较慢,我习惯复制下载链接后到迅雷去下载,更快一些 双击安装后会有个选项是add....什么什么,意思是添加桌面快捷方式 后有个选项是退出并重启,这个重启是重启电脑(所以截图没有了),记得保存好自己的文档 问卷调查 …

修理牛棚

思路: 有的牛棚住牛,有的是空的,从反过来的思路来想,先用一块木板盖住所有有猪住的猪棚,减去空牛棚数,最终得到最多被木板挡住门的牛棚的数量。 代码展示: #include<bits/stdc++.h> using namespace std; const int N=210; int m,s,c;int a[N],b[N];int main() {c…

写了个 CasaOS/ZimaOS 内网穿透的远程访问插件(不是 frp 或者 nps),欢迎大家测试使用

插件正在提交,应该过几天就会进入市场了。 插件访问效果大概如下: casaOS 远程界面 如果大家想先行测试可以手动下载 pr 的文件进行测试。使用 插件会提供一个二维码,使用OpenIoThub 开源 APP扫码添加插件网关,然后在客户端上添加要访问的主机,然后在主机下面添加端口,然…