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

news2024/11/28 19:46:28

目录

一、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 \m

3
[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 -nr
  48814 302
  27141 200
  20057 499
   1674 404
   1317 403
     97 206
      2 408

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

将图像的rgb数据转成DICOM医学图像格式

dcmtk官方文档:https://support.dcmtk.org/docs/ dcmtk最新源码下载:https://www.dcmtk.org/en/dcmtk/dcmtk-software-development/ dcmtk旧版本源码下载:https://dicom.offis.de/download/dcmtk/ 用DCMTK库实现将图像转成dcm格式 dcmtk库的…

常见面试题-Redis 切片集群以及主节点选举机制

Redis 切片集群了解吗? 答: Redis 切片集群是目前使用比较多的方案,Redis 切面集群支持多个主从集群进行横向扩容,架构如下: 使用切片集群有什么好处? 提升 Redis 读写性能,之前的主从模式中&…

构建强大的接口自动化测试框架:Pytest实践指南!

一. 背景 Pytest目前已经成为Python系自动化测试必学必备的一个框架,网上也有很多的文章讲述相关的知识。最近自己也抽时间梳理了一份pytest接口自动化测试框架,因此准备写文章记录一下,做到尽量简单通俗易懂,当然前提是基本的py…

系列二十四、Spring设计模式之策略模式

一、前言 对于我们Java开发人员来说,Spring框架的重要性不言而喻,可以说Java领域之所以发展这么壮大,生态这么丰富,功能这么强大,是离不开Spring以及由其衍生出来的各种子模块的,正是由它们共同奠定了JavaE…

波司登发布2023/24上半财年业绩:稳健高质量增长,旺季业绩可期

11月27日,羽绒服巨头波司登(03998.HK)正式发布 2023/24上半财年业绩。财报显示,公司营收和净利润连续6年创同期历史新高,经营溢利增速再次快于收入增速。 自2018 年战略转型坚持“聚焦主航道、聚焦主品牌”后&#xf…

前端---JavaScript篇

1. 介绍 JavaScript 是 前端开发人员必须学习的 3 门语言中的一门: HTML 定义了网页的内容CSS 描述了网页的布局JavaScript 控制了网页的行为 接下来开始详解JavaScript。 2.引入方法 js有两种导入方式,一种是内部脚本:直接在html页面中…

MaskDINO环境搭建与模型测试

1、环境搭建 1、构建虚拟环境安装torch conda create -n mmdetsam python3.8 -y conda activate mmdetsampip install torch1.10.0cu102 torchvision0.11.0cu102 torchaudio0.10.0 -f https://download.pytorch.org/whl/torch_stable.html -i http://mirrors.aliyun.com/pypi…

如何用眼精星票证识别系统识别名片?

近年来,随着信息化技术的不断发展,越来越多的人开始使用电子名片来进行商务交流和信息传递。然而,如何将纸质名片转化为电子名片并结构化数据,却一直是许多人的难题。本文将介绍一种使用眼精星票证识别系统的方法,将纸…

揭秘Git高手的10个秘密武器:让你的工作效率飙升!

Git和GitHub是每个软件工程师都必须了解的最基本的工具。它们是开发人员日常工作不可或缺的一部分,每天都要与之互动。 精通Git不仅能简化你的日常操作,还能显著提高生产力。在这篇文章中,我们将探讨一组能够极大提升生产力的命令。 随着对…

波兰边缘计算初创公司获得450w欧元融资

边缘计算社区获悉,近期,波兰边缘计算初创公司CTHINGS.CO 获得450w欧元A轮融资。 以下是官方声明: CTHINGS.CO 获得 2000 万兹罗提(约450 万欧元)用于国际扩张。此轮融资涉及 ORLEN VC、PKO VC、Freya Capital 和现有投…

AWS连甩3项Serverless创新,高效创建和操作缓存,用AI优化资源配置性价比

云创科技11月28日拉斯维加斯报道,在一年一度的AWS re:Invent首日,AWS实用计算高级副总裁Peter DeSantis延续Monday Night Live的传统,发表主题演讲并分享了AWS数据库和分析产品组合中的3项Serverless创新,以帮助客户在任何规模下分…

【项目实战】SpringBoot连接openGauss

一:Docker安装openGauss 1.下载openGauss 安装好Docker好以后,执行如下命令下载openGauss3.0镜像。docker pull enmotech/opengauss:3.0.0 2.运行openGauss 执行如下命令docker run -itd --name opengauss \ --restartalways \ --privilegedtrue \ …

TLS、对称/非对称加密、CA认证

1. SSL与TLS SSL/TLS是一种密码通信框架,他是世界上使用最广泛的密码通信方法。SSL/TLS综合运用了密码学中的对称密码,消息认证码,公钥密码,数字签名,伪随机数生成器等,可以说是密码学中的集大成者。 TLS…

uniapp设置手机通知权限以及uniapp-push2.0推送

unipush2.0代码 export default function () {// 调用获取用户通知权限setPermissions()// 获取客户端唯一的推送标识,可用于测试uni.getPushClientId({success: (res) > {console.log(res.cid)},fail(err) {console.log(err)}})// 监听推送uni.onPushMessage(r…

苹果手机如何格式化?五个步骤快速掌握!

如果手机出现异常情况,例如运行缓慢、频繁崩溃,又或者想将手机出售、转让给他人,那么将手机格式化可以有助于解决问题。苹果手机如何格式化?本文将为您介绍解决方法,只需要五个步骤就能搞定,帮助您快速掌握…

MES系统数字化看板:生产过程透明化与优化

在当今的制造业中,实现生产过程的透明化和优化已成为企业持续发展的关键。MES系统(制造执行系统)作为实现这一目标的重要工具,其数字化看板功能在生产现场管理中发挥着越来越重要的作用。 一、MES系统的基本概念与功能 MES系统是…

【算法刷题】Day7

文章目录 283. 移动零1089. 复写零 283. 移动零 原题链接 看到题目,首先看一下题干的要求,是在原数组内进行操作,平切保持非零元素的相对顺序 这个时候我们看到了示例一: [ 0, 1, 0, 3,12 ] 这个时候输出成为了 [ 1, 3, 12, 0, …

Langchain-Chatchat学习

参考:Langchain-Chatchat 阿里通义千问Qwen 保姆级教程 | 次世代知识管理解决方案 - 知乎 (zhihu.com) 中文LLM生态观察 模型 就开源的部分而言,从一开始的MOSS[1] ChatGLM[2] ChatGLM2 [3] 到后来的 baichan [4] 基于LLama2 微调的 中文LLama2 [5] …

ubuntu改window任务栏

经常在ubuntu和win之间切换,任务栏的布局不统一会让人很别扭,个人很喜欢win任务栏的不折叠图标功能,而ubuntu没有,又很喜欢的ubuntu的多工作空间,效率比副屏还高,还可以自定义切换工作空间的快捷键。鱼和熊…

(附源码)基于NET学生信息管理系统-计算机毕设 24077

基于NET学生信息管理系统 摘 要 随着互联网趋势的到来,各行各业都在考虑利用互联网将自己推广出去,最好方式就是建立自己的互联网系统,并对其进行维护和管理。在现实运用中,应用软件的工作规则和开发步骤,采用C#技术建…