【shell】文本三剑客之sed详解

目录

一、sed简介(行编辑器)

二、基本用法

三、sed脚本格式(匹配地址 脚本命令)

1、不给地址,那么就是针对全文处理

2、单地址,表示#,指定的行,$表示最后一行,/pattter/:表示该模式能匹配到的每一行,正则表达式

3、地址范围:

#,# 从第几行到第几行

#,+#从第几行开始,往后加4行

/patter1/,/patter2/ 表示从第一个开始找,到第二个结束

4、步进:~

1~2:表示奇数行

2~2:表示偶数行

3~3:表示可以3的倍数行

5、高级空间用法

sed -n 'n;p' 表示打印偶数行,表示从第一行开始,先放入高级空间,下一行打印,反复以往,表示打印偶数行

sed -n '2,${n;p}' 表示奇数行,表示从第二行开始,先放入高级空间,下一行打印,反复以往,表示打印奇数行

 四、搜索替代

五、分组后项引用

面试题一:可以自定义输出匹配内容的顺序

面试题二:使用sed的分组后项引用来提取ip地址

面试题三:提取版本号

面试题四:提取文件的权限

面试题五:提取访问日志中的状态码

面试题六、提取日志的状态码


一、sed简介(行编辑器)

Sed是从文件或管道中读取一行,处理一行,输出一行;再读取一行,再处理一行,再输出一行,直到最后一行。每当处理一行时,把当前处理的行存储在临时缓冲区中,称为模式空间(PatternSpace),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。一次处理一行的设计模式使得sed性能很高,sed在读取大文件时不会出现卡顿的现象。如果使用vi命令打开几十M上百M的文件,明显会出现有卡顿的现象,这是因为vi命令打开文件是一次性将文件加载到内存,然后再打开。Sed就避免了这种情况,一行一行的处理,打开速度非常快,执行速度也很快。

sed支持 标准输入、标准输出、文件名

二、基本用法

语法:sed [命令选项]  '匹配地址 脚本命令' 文件名或标准输出或标准输入

常用的命令选项:

选项功能
-n不输出模式空间的内容到屏幕,即不自动打印
-e多点编辑器,相当于/匹配1|匹配2/
-f filename从指定文件中读取编辑脚本
-r,-E使用扩展正则表达式
-i.bak备份文件并原处编辑
#说明:
-ir 不支持
-i -r 支持
-ri   支持
-ni   会清空文件

 sed -i 作为行编辑器,一旦生效,无法撤回,所以强烈建议修改的时候加上-i.bak,可以进行备份

[root@localhost data]#sed -i.bak '1,4d' html.txt 
[root@localhost data]#cat html.txt
http://www.google.com/index.html
http://www.yahoo.com.cn/put.html
[root@localhost data]#ls
123.txt  html.txt  html.txt.bak  md5.txt  sort.sh  uniq.sh
[root@localhost data]#cat html.txt.bak ##bak也可以是别的字母,只是因为bak是backup的缩写,所以常使用bak

三、sed脚本格式(匹配地址 脚本命令

1、不给地址,那么就是针对全文处理

2、单地址,表示#,指定的行,$表示最后一行,/pattter/:表示该模式能匹配到的每一行,正则表达式

3、地址范围:

#,# 从第几行到第几行

#,+#从第几行开始,往后加4行

/patter1/,/patter2/ 表示从第一个开始找,到第二个结束

 

4、步进:~

1~2:表示奇数行

2~2:表示偶数行

3~3:表示可以3的倍数行

5、高级空间用法

sed -n 'n;p' 表示打印偶数行,表示从第一行开始,先放入高级空间,下一行打印,反复以往,表示打印偶数行

sed -n '2,${n;p}' 表示奇数行,表示从第二行开始,先放入高级空间,下一行打印,反复以往,表示打印奇数行

这些脚本命令一般与命令选项-i一起搭配使用 

脚本命令,操作

p:打印,如果是同时指定行,表示打印指定行;如果不指定行,则表示打印所有内容;如果有非打印字符,则以ASCII码输出。其通常与“-n”选项一起使用。

q:表示到第几行就退出,必须从第一行开始,3q就是1-3行

s:替换,替换指定字符

d:删除,删除选定的行

a:增加,在当前行下面增加一行指定内容

i:插入,在指定行上面插入一行指定内容

c:替换,将指定的行替换为指定内容(整行替换)

y:字符替换,转换前后的字符长度要一致

=:打印行号,这个是在前一行打印

r:表示读取文件内容,放入指定行后面

w:w file 保存模式匹配的行至指定文件

! :表示模式空间中匹配行取反处理

##没有-n,单独就是3q使用,可以表示打印前几行
[root@localhost data]#cat /etc/passwd|sed '3q'
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin

 

[root@localhost data]#seq 5|sed '3ahhhh'[root@localhost data]#seq 5|sed '3ahhhh\n    hhhh'[root@localhost data]#seq 5|sed '3a    hhhh'[root@localhost data]#seq 5|sed '3a\    hhhh'

 

 

[root@localhost data]#seq 3|sed '2r /etc/issue'
1
2
\S
Kernel \r on an \m3
[root@localhost data]#seq 3|sed '2w /data/2.txt'
1
2
3
[root@localhost data]#cat 2.txt 
2

 

 四、搜索替代

s/pattern/string/修饰符 查找替换,支持使用其它分隔符,可以是其它形式:s@@@,s###
替换修饰符:
g 行内全局替换
2 表示行内的第2个匹配内容
p 显示替换成功的行
w   /PATH/FILE 将替换成功的行保存至文件中
I,i   忽略大小写sed 's/root/&er/g' /etc/passwd
#&指代之前找到的内容
替换的内容应该是一个指定的存在的内容,不可以用正则表达式,这里可以用&这个符号指代前面匹配到的内容

五、分组后项引用

虽然sed是用来一行一行处理的,但是还是可以利用分组后项引用的办法来提取有相同标志的列

两种方式:①先匹配关键字的前后部分有什么特点,②找到关键字的特点,将整行用正则表达式采用分组表示

面试题一:可以自定义输出匹配内容的顺序

面试题二:使用sed的分组后项引用来提取ip地址

[root@localhost data]#ifconfig ens33|sed -rn '2s/.*inet ([0-9.]+) .*/\1/p'
192.168.20.8
[root@localhost data]#ifconfig ens33|sed -n '2p'inet 192.168.20.8  netmask 255.255.255.0  broadcast 192.168.20.255
[root@localhost data]#

面试题三:提取版本号

[root@localhost data]#cat jar.txt |sed -nr 's/.*-(.*).jar/\1/p'
[root@localhost data]#cat jar.txt |awk -F"(-|.jar)"  '{print $(NF-1)}'

 

面试题四:提取文件的权限

[root@localhost data]#stat 2.txt 文件:"2.txt"大小:2         	块:8          IO 块:4096   普通文件
设备:fd00h/64768d	Inode:20205496    硬链接:1
权限:(0644/-rw-r--r--)  Uid:(    0/    root)   Gid:(    0/    root)
最近访问:2023-11-28 18:27:04.306430260 +0800
最近更改:2023-11-28 18:26:57.672457605 +0800
最近改动:2023-11-28 18:26:57.672457605 +0800
创建时间:-
[root@localhost data]#stat 2.txt |sed -nr '4s/.*([0-9]{4}).*/\1/p'
0644[root@localhost data]#stat 2.txt |sed -n '4p'|egrep -o "[0-9]{4}"
0644[root@localhost data]#stat 2.txt |awk -F"[(/]" 'NR==4{print $2}'
0644

面试题五:提取访问日志中的状态码

[root@localhost data]#cat log |head -5|awk -F, '{print $2}'

面试题六、提取日志的状态码

[root@localhost data]#cat log |sed -nr 's/.*HTTP\/1.1" ([0-9]{3}) .*/\1/p'|sort|uniq -c|sort -nr48814 30227141 20020057 4991674 4041317 40397 2062 408

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

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

相关文章

redis运维(十二) 位图

一 位图 ① 概念 1、说明:位图还是在操作字符串2、位图玩字符串在内存中存储的二进制3、ASCII字符通过映射转化为二进制4、操作的是字符串value ② ASCII字符铺垫 1、控制ASCII字符 2、ASCII可显示字符 ③ SETBIT 细节: setbit 命令的返回值是之…

Vue + Element UI 实现复制当前行数据功能及解决复制到新增页面组件值不更新的问题

文章目录 引言第一部分:复制当前行数据功能的实现1.1 环境准备1.2 创建表格并渲染数据1.3 解决复制的数据不更新问题 第二部分:拓展知识2.1 Vue的响应性原理2.2 Element UI的更多用法 结语 Vue Element UI 实现复制当前行数据功能及解决复制到新增页面组…

数据结构与算法--特殊的完全二叉树--堆,堆排序,利用堆解决topk的问题

目录 前言 1.树概念及结构 1.1树的概念 1.2 树的相关概念 1.3 树的表示 1.4 树在实际中的运用(表示文件系统的目录树结构) 2.二叉树概念及结构 2.1概念 2.2现实中的二叉树: 2.3 特殊的二叉树: 2.4 二叉树的性质 …

SimpleDateFormat在多线程下的安全问题

目录 情景重现 SimpleDateFormat解析 解决方案 局部变量 加锁 使用线程变量 使用DateTimeFormatter 情景重现 SimpleDateFormat类是Java开发中的一个日期时间的转化类。它可以满足绝大多数的开发场景,但是在高并发下会出现并发问题。接下来查看下文中的案例。…

php的字符转义函数有那些,是干什么的

在 PHP 中,字符转义函数是用于处理字符串中的特殊字符,以防止这些字符被误解、滥用或引起安全问题的一组函数。这些函数的主要作用是确保在将用户提供的数据插入到数据库、构建 HTML 输出或进行其他与安全相关的操作时,不会导致潜在的安全漏洞…

enum常用方法 - Java

六、enum常用方法 0、准备工作1、name()2、ordinal()3、values()4、valueOf()5、compareTo()6、toString() 说明:使用关键字enum时,会隐式 继承 Enum类,这样我们就可以使用 Enum 类相关的方法。 0、准备工作 enum Season2 {SPRING("…

Django快速搭建静态网页

Django的快速搭建 这个是例子 这个是一个目录 项目名称:项目似乎被命名为DJ0928,这是Django项目的根目录。 文件都是Django项目的核心配置文件。 settings.py 包含了项目的配置设置。urls.py 定义了项目的URL路由。wsgi.py 和 asgi.py 分别用于Web服务器…

springboot集成springsecurity

转载自&#xff1a;www.javaman.cn 1、整合springsecurity 添加pom.xml <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId> </dependency>2、springsecurity认证授权流程…

uniapp挽留提示2.0

项目需求&#xff1a;有时候挽留的ui是全屏的&#xff0c;用page-container也可以。后来产品提了个问题&#xff0c;手机侧滑的时候没那么顺畅&#xff08;就是一用侧滑&#xff0c;就显示出来&#xff0c;产品要的方案是如下图&#xff0c;emmm大概是这个意思&#xff09; 后面…

网络协议系列:TCP三次握手,四次挥手的全过程,为什么需要三次握手,四次挥手

TCP三次握手&#xff0c;四次挥手的全过程&#xff0c;为什么需要三次握手&#xff0c;四次挥手 一. TCP三次握手&#xff0c;四次挥手的全过程&#xff0c;为什么需要三次握手&#xff0c;四次挥手前言TCP协议的介绍三次握手三次握手流程&#xff1a;1. A 的 TCP 向 B 发送 连…

爬虫项目实战:利用基于selenium框架的爬虫模板爬取豆瓣电影Top250

&#x1f44b; Hi, I’m 货又星&#x1f440; I’m interested in …&#x1f331; I’m currently learning …&#x1f49e; I’m looking to collaborate on …&#x1f4eb; How to reach me … README 目录&#xff08;持续更新中&#xff09; 各种错误处理、爬虫实战及模…

浏览器插api开发文档

chrome谷歌浏览器开发文档

软著项目推荐 深度学习二维码识别

文章目录 0 前言2 二维码基础概念2.1 二维码介绍2.2 QRCode2.3 QRCode 特点 3 机器视觉二维码识别技术3.1 二维码的识别流程3.2 二维码定位3.3 常用的扫描方法 4 深度学习二维码识别4.1 部分关键代码 5 测试结果6 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天…

Java后端开发——JDBC(万字详解)

Java后端开发——JDBC&#xff08;万字详解&#xff09; 今日目标 掌握JDBC的的CRUD理解JDBC中各个对象的作用掌握Druid的使用 1&#xff0c;JDBC概述 在开发中我们使用的是java语言&#xff0c;那么势必要通过java语言操作数据库中的数据。这就是接下来要学习的JDBC。 1.1 …

GitHub桌面版

GitHub桌面版 一、GitHub 桌面版二、clone 仓库三、更新仓库 一、GitHub 桌面版 二、clone 仓库 三、更新仓库

Spring面向切面编程(AOP);Spring控制反转(IOC);解释一下Spring AOP里面的几个名词;Spring 的 IoC支持哪些功能

文章目录 Spring面向切面编程(AOP)什么是AOPSpring AOP and AspectJ AOP 的区别&#xff1f;Spring AOP中的动态代理如何理解 Spring 中的代理&#xff1f;解释一下Spring AOP里面的几个名词Spring在运行时通知对象Spring切面可以应用5种类型的通知&#xff1a;什么是切面 Aspe…

Modbus TCP

Modbus &#xff08;&#x1f446; 百度百科&#xff0c;放心跳转&#xff09; 起源 Modbus 由 Modicon 公司于 1979 年开发&#xff0c;是一种工业现场总线协议标准。 Modbus 通信协议具有多个变种&#xff0c;支持串口&#xff0c;以太网多个版本&#xff0c;其中最著名的…

一种方便、优美的使用Python调用fofa API的方法

免责声明&#xff1a;由于传播或利用此文所提供的信息、技术或方法而造成的任何直接或间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c; 文章作者不为此承担任何责任。 学习网络安全的过程中&#xff0c;绕不开fofa搜索&#xff0c;我的需求是使用fofa获取互联网所…

安防监控视频融合平台EasyCVR定制化页面开发

安防监控EasyCVR视频汇聚平台基于云边端智能协同&#xff0c;支持海量视频的轻量化接入与汇聚、转码与处理、全网智能分发、视频集中存储等。安防视频平台EasyCVR拓展性强&#xff0c;视频能力丰富&#xff0c;具体可实现视频监控直播、视频轮播、视频录像、云存储、回放与检索…

牛客 算法题 【HJ102 字符统计】 golang实现

题目 HJ102 字符统计 golang代码实现 package mainimport ("bufio""fmt""os""sort" )func main() {// str_arry :make([]string, 0)str_map : make(map[rune]int)result_map : make(map[int][]string)scanner : bufio.NewScanner(os…