您当前的位置:首页 > 电脑百科 > 软件技术 > 操作系统 > linux百科

Linux三剑客之sed多行处理

时间:2023-04-03 14:27:30  来源:今日头条  作者:小毛驴的烂笔头

业务爸爸:小毛驴我有个历史交易记录数据,以ID开头(如ID Apple450001315857834)到 TIME结束(如TIME 1673615211)表示一条完整的记录,其中中间有RFTIME行(如RFTIME 1673696951)表示交易正常,反正是交易异常。现在需要把交易异常的记录拿出来。数据如下:

root@VM-2-15-ubuntu:~# cat list.txt 
ID      apple450001315857834
PR      25
RFTIME  1673696951
SAVEID  xmlCAtgyXH
TIME    1673615211
ID      apple450001216057835
PR      25
SAVEID  xmlCAtgyXH
TIME    1663042017
ID      apple450001315857834
PR      25
RFTIME  1673696951
SAVEID  xmlCAtgyXH
TIME    1673615211
ID      apple450001216057835
PR      25
SAVEID  xmlCAtgyXH
TIME    1663042017
ID      apple450001315857834
PR      25
RFTIME  1673696951
SAVEID  xmlCAtgyXH
TIME    1673615211
ID      apple450001216057835
PR      25
SAVEID  xmlCAtgyXH
TIME    1663042017
ID      apple450001315857834
PR      25
RFTIME  1673696951
SAVEID  xmlCAtgyXH
TIME    1673615211
ID      apple450001315857834
PR      25
RFTIME  1673696951
SAVEID  xmlCAtgyXH
TIME    1673615211
ID      apple450001315857834
PR      25
RFTIME  1673696951
SAVEID  xmlCAtgyXH
TIME    1673615211
ID      apple450001315857834
PR      25
RFTIME  1673696951
SAVEID  xmlCAtgyXH
TIME    1673615211
ID      apple450001216057835
PR      25
SAVEID  xmlCAtgyXH
TIME    1663042017

小毛驴:安排!

拿到这个需求,小毛驴第一就想到了用sed多行处理,而且也洋洋洒洒的写出来第一个版本:

sed -nr ':a;N;/TIME/!ba;/RFTIME/!p;' list.txt

root@VM-2-15-ubuntu:~# sed -nr ':a;N;/TIME/!ba;/RFTIME/!p;' list.txt 
SAVEID  xmlCAtgyXH
TIME    1673615211
ID      apple450001216057835
PR      25
SAVEID  xmlCAtgyXH
TIME    1663042017
SAVEID  xmlCAtgyXH
TIME    1673615211
ID      apple450001216057835
PR      25
SAVEID  xmlCAtgyXH
TIME    1663042017
SAVEID  xmlCAtgyXH
TIME    1673615211
ID      apple450001216057835
PR      25
SAVEID  xmlCAtgyXH
TIME    1663042017
SAVEID  xmlCAtgyXH
TIME    1673615211
SAVEID  xmlCAtgyXH
TIME    1673615211
SAVEID  xmlCAtgyXH
TIME    1673615211
SAVEID  xmlCAtgyXH
TIME    1673615211
ID      apple450001216057835
PR      25
SAVEID  xmlCAtgyXH
TIME    1663042017

很明显上面的不符合需求,这个时候,很明显是数据锚定有问题, 此时我只能请出sed的debug工具---sedsed。

sedsed安装

cd /usr/local/sbin
wget https://raw.Githubusercontent.com/aureliojargas/sedsed/mAIn/sedsed.py
wget https://raw.githubusercontent.com/aureliojargas/sedparse/main/sedparse.py
mv sedsed.py sedsed
chmod +x sedsed

sed三个空间 如下图。
PATT: sedsed输出显示模式空间缓冲区的内容
COMM: 显示正在执行的命令
HOLD: 显示hold sapce缓冲区的内容

sed一次处理一行内容,处理时,把当前处理的行存储在临时缓冲区中,称为"模式空间"(pattern space);
接着用sed命令处理缓冲区(pattern space)中的内容,处理完成后,把缓冲区(pattern space)的内容送往屏幕.
接着清空缓冲区(pattern space),处理下一行,这样不断重复,直到文件末尾.

sed一次处理一行内容,处理时,先读入一行,去掉尾部换行符,存入pattern space,执行编辑命令.
处理完毕,除非加了-n参数,把现在的pattern space打印出来,在后边打印曾去掉的换行符.

pattern space(模式空间)相当于sed车间把流内容在这里处理.
hold space(保留空间)相当于仓库,加工的半成品在这里临时储存(当然加工完的成品也在这里存储).

 

开始调试

PATT:ID      apple450001315857834$ //模式空间 读入第一行
HOLD:$   // 此时hold sapce为空
COMM::a  // 执行条件选择a
COMM:N   // 追加读一行数据
PATT:ID      apple450001315857834nPR      25$ // 模式空间此时内容
HOLD:$ // 此时hold sapce为空
COMM:/TIME/ !b a  //执行条件选择a,不满足,继续读取下一行
COMM:N
PATT:ID      apple450001315857834nPR      25nRFTIME  1673696951$ // 模式空间此时内容
HOLD:$  // 此时hold sapce为空
COMM:/TIME/ !b a //执行条件选择a,满足了---竟然满足了。问题就出现在这了。
COMM:/RFTIME/ !p // 满足就不打印
PATT:ID      apple450001315857834nPR      25nRFTIME  1673696951$ // 模式空间此时内容将会被清空
HOLD:$ 
PATT:SAVEID  xmlCAtgyXH$ // 模式空间读入一个新行
HOLD:$
COMM::a
COMM:N
PATT:SAVEID  xmlCAtgyXHnTIME    1673615211$
HOLD:$
COMM:/TIME/ !b a

 

通过上面debug我们可以看出是因为RFTIME匹配到TIME,这个真是不细心的的原因。 改(尝试了30多分钟,才用debug工具看出来,真是xx。)

root@VM-2-15-ubuntu:~# sed -nr ':a;N;/bTIME/!ba;/RFTIME/!p;' list.txt 
ID      apple450001216057835
PR      25
SAVEID  xmlCAtgyXH
TIME    1663042017
ID      apple450001216057835
PR      25
SAVEID  xmlCAtgyXH
TIME    1663042017
ID      apple450001216057835
PR      25
SAVEID  xmlCAtgyXH
TIME    1663042017
ID      apple450001216057835
PR      25
SAVEID  xmlCAtgyXH
TIME    1663042017


Tags:sed   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
Linux中sed命令的五个高级用法
在Linux系统中,sed(Stream Editor)是一个强大的文本处理工具,它可以对文本进行编辑、转换和替换。sed命令的基本用法已经很常见,但它还有一些高级用法,可以帮助您更高效地处理文本...【详细内容】
2023-11-28  Search: sed  点击:(206)  评论:(0)  加入收藏
Linux三剑客之sed多行处理
业务爸爸:小毛驴我有个历史交易记录数据,以ID开头(如ID apple450001315857834)到 TIME结束(如TIME 1673615211)表示一条完整的记录,其中中间有RFTIME行(如RFTIME 1673696951)表示交易...【详细内容】
2023-04-03  Search: sed  点击:(218)  评论:(0)  加入收藏
通过 20 个实例掌握 Linux Sed 命令
SED 命令或 流编辑器是 Linux / Unix 系统提供的非常强大的实用程序。它主要用于文本替换,查找和替换,但也可以执行其他文本操作,例如 插入,删除,搜索 等。使用 SED,我们可以编...【详细内容】
2023-02-04  Search: sed  点击:(138)  评论:(0)  加入收藏
Linux运维三剑客 grep、awk、sed实用笔记
grep{ -c # 显示匹配到得行的数目,不显示内容 -h # 不显示文件名 -i # 忽略大小写 -l # 只列出匹配行所在文件的文件名 -n...【详细内容】
2022-03-21  Search: sed  点击:(445)  评论:(0)  加入收藏
Linux sed命令
大数据技术AI Flink/Spark/Hadoop/数仓,数据分析、面试,源码解读等干货学习资料 98篇原创内容 -->公众号 Linux sed 命令是利用脚本来处理文本文件。sed 可依照脚本的指令来处...【详细内容】
2021-12-17  Search: sed  点击:(306)  评论:(0)  加入收藏
Linux三剑客awk、grep、sed详解
一、前言linux 有很多工具可以做文本处理,例如:sort, cut, split, join, paste, comm, uniq, column, rev, tac, tr, nl, pr, head, tail.....,学习 linux 文本处理的懒惰方式(...【详细内容】
2021-08-05  Search: sed  点击:(265)  评论:(0)  加入收藏
Linux文本处理三剑客之sed命令全面解析,一文就够了
作用 sed命令是一个非交互式的行文本编辑器,它能对文件内容进行编辑,默认每次处理文本文件中所匹配到一行内容到模式空间,然后用后面的命令进行操作,操作完成之后,会把模式空间里...【详细内容】
2020-10-27  Search: sed  点击:(626)  评论:(0)  加入收藏
运用sed命令高效地删除文件的特定行
正常来说,我们想要删除文件中的某些行内容,一般都是先打开这个文件,然后找到要删除的内容,再然后选中这些行并按删除键进行删除,这在数据量很少时是没有问题的。但是,一旦文件中的...【详细内容】
2020-08-27  Search: sed  点击:(272)  评论:(0)  加入收藏
sed 命令快速入门
接上文:grep命令快速入门Linux 文本操作的三大神器:grep、sed、awk,各自的最佳应用场景: grep:使用正则表达式搜索文本,并把匹配的行打印出来,是强大的文本搜索工具; sed:用于编辑匹...【详细内容】
2020-08-13  Search: sed  点击:(302)  评论:(0)  加入收藏
Linux Shell工具之 sed/awk
分享下处理数据分析时,linux shell 两个比较基础的工具sed 指令非交互式的字符流编辑器,支持对多文件多行的管道处理sed [option] 'command' f.txtsed -n '2,3p...【详细内容】
2020-07-24  Search: sed  点击:(374)  评论:(0)  加入收藏
▌简易百科推荐
微软 Win11 Linux 子系统(WSL)发布 2.2.2 版本
IT之家 4 月 8 日消息,微软近日更新 Windows Subsystem for Linux(WSL),最新 2.2.2 版本中带来了诸多改进,重点更新了 nft 规则,可以让 IPv6 流量通过 Linux 容器。图源: dev.to,AI...【详细内容】
2024-04-08    IT之家  Tags:Linux   点击:(6)  评论:(0)  加入收藏
从原理到实践:深入探索Linux安全机制
Linux 是一种开源的类Unix操作系统内核,由Linus Torvalds在1991年首次发布,其后又衍生出许多不同的发行版(如Ubuntu、Debian、CentOS等)。前言本文将从用户和权限管理、文件系统...【详细内容】
2024-03-27  凡夫编程  微信公众号  Tags:Linux安全   点击:(16)  评论:(0)  加入收藏
在Linux系统中,如何处理内存管理和优化的问题?
本文对 Linux 内存管理和优化的一些高级技巧的详细介绍,通过高级的内存管理技巧,可以帮助系统管理员和开发人员更好地优化 Linux 系统的内存使用情况,提高系统性能和稳定性。在...【详细内容】
2024-03-26  编程技术汇  微信公众号  Tags:Linux   点击:(10)  评论:(0)  加入收藏
Linux 6.9-rc1 内核发布:AMD P-State 首选核心、BH 工作队列
IT之家 3 月 25 日消息,Linus Torvalds 宣布,Linux 6.9 内核的首个 RC(候选发布)版 Linux 6.9-rc1 发布。▲ Linux 6.9-rc1Linus 表示,Linux 内核 6.9 看起来是一个“相当正常”...【详细内容】
2024-03-25    IT之家  Tags:Linux   点击:(11)  评论:(0)  加入收藏
轻松实现Centos系统的软件包安装管理:yum指令实战详解
yum 是一种用于在 CentOS、Red Hat Enterprise Linux (RHEL) 等基于 RPM 的 Linux 发行版上安装、更新和管理软件包的命令行工具。它可以自动解决软件包依赖关系,自动下载并...【详细内容】
2024-02-27  凡夫贬夫  微信公众号  Tags:Centos   点击:(54)  评论:(0)  加入收藏
Win + Ubuntu 缝合怪:第三方开发者推出“Wubuntu”Linux 发行版
IT之家 2 月 26 日消息,一位第三方开发者推出了一款名为“Wubuntu”的缝合怪 Linux 发行版,系统本身基于 Ubuntu,但界面为微软 Windows 11 风格,甚至存在微软 Windows 徽标。据...【详细内容】
2024-02-27    IT之家  Tags:Ubuntu   点击:(49)  评论:(0)  加入收藏
Linux中磁盘和文件系统工作原理解析
在Linux系统中,一切皆文件的概念意味着所有的资源,包括普通文件、目录以及设备文件等,都以文件的形式存在。这种统一的文件系统管理方式使得Linux系统具有高度的灵活性和可扩展...【详细内容】
2024-02-20  王建立    Tags:Linux   点击:(51)  评论:(0)  加入收藏
Linux子系统概览
inux操作系统是一个模块化的系统,由多个子系统组成。这些子系统协同工作,使Linux能够执行各种任务。了解Linux的子系统有助于更好地理解整个操作系统的运作机制。以下是Linux...【详细内容】
2024-02-01    简易百科  Tags:Linux   点击:(77)  评论:(0)  加入收藏
Linux内核:系统之魂与交互之源
内核,作为任何基于Linux的操作系统的心脏,扮演着至关重要的角色。它不仅是计算机系统软件与硬件之间的桥梁,更是确保系统稳定、高效运行的关键。内核提供了一系列核心功能,为上...【详细内容】
2024-02-01  松鼠宝贝    Tags:Linux内核   点击:(68)  评论:(0)  加入收藏
如何确保Linux进程稳定与持久
在Linux系统中,进程的稳定性与持久性对于维持系统的持续运行至关重要。然而,由于各种原因,进程可能会面临崩溃或系统重启的情况。为了确保关键进程能够持续运行,我们必须采取一...【详细内容】
2024-01-19  松鼠宝贝    Tags:Linux进程   点击:(85)  评论:(0)  加入收藏
站内最新
站内热门
站内头条