深入理解sed模式空间——sed ‘n;p‘

2023-11-17

在进入正题之前我们先来了解一下sed的模式空间,如下

什么是sed的模式空间?

答(仅供参考):就是从文件读取一行文本然后存入的缓冲区,然后命令操作模式空间的内容,在初始状态下模式空间是没有内容的,在每次循环读取数据的过程中,模式空间都会被清空并写入新的内容。

解释以下命令结果:

  1. seq 10 | sed 'n;p'
  2. seq 10 | Sed -n 'n;p'
  3. seq 10 | sed 'p;n'
  4. seq 10 | sed -n p;n'

要进一步理解sed的工作原理,弄清上面四个命令便足够了,大家不妨猜一下上面四条命令的输出结果......

不知道大家有没有猜对,不过结果如下:

我想应该不少人都会对上面的结果产生困惑,为了照顾到大部分人,我尽量啰嗦一点吧,如下

第一个命令:seq 10 | sed 'n;p'

解:命令“ seq 10 ”按顺序生成 1 到 10 的 10 行数据,通过管道命令“ | ”把结果传给 sed 命令来处理,

  命令“ sed 'n;p' ”就会依次按行读入管道|传过来的数据,

  第一轮 sed :

  seq 把生成的“ 1 ”传给 sed ,现在 sed 的处理缓冲区就有数据“ 1 ”,有了数据“ 1 ”之后 sed 便执行单引号里的“ n;p ”命令

  n和p用“ ; ”分隔,表示依次执行,所以先执行“ n ”命令,n命令的理解就很关键了(我一开始也搞不清楚),其实n命令就是读入下一行数据,在“ seq 10 | sed 'n;p' ”这里就是读入“ 2 ”,那原来的“ 1 ”怎么办呢(关键),sed会默认把不要的数据丢到stdout(标准输出,也就是屏幕)那里,所以就会在屏幕上打印出第一行数据“ 1 ”;得到了第一个输出然后命令还没结束!

  刚刚执行的是“ n;p ”命令的 n ,接下来就到 p 了,p 就是直接打印 sed 缓冲区的内容,现在缓冲区里面是“ 2 ”,所以直接打印“ 2 ”,现在我们的屏幕就有了2行数据了,分别是第一行:1,第二行:2

  第一轮 sed 'n;p' 执行完毕。

  第二轮 sed :

  与上面上第一轮的差不多,如下:

  seq 把生成的“ 3 ”传给 sed (是 3 不是 2, 不要乱了),(关键)sed 的缓冲区里面现在有“ 2 ”’,然后现在又读入了新的“ 3 ”,sed会默认把不要的数据(在这里就是 2 )丢到标准输出,所以这时屏幕打印第三行数据“ 2 ”,所以现在 sed 的处理缓冲区就有数据“ 3 ”,有了数据“ 3 ”之后 sed 便执行单引号里的“ n;p ”命令

  n和p用“ ; ”分隔,表示依次执行,所以先执行“ n ”命令,n命令的理解就很关键了(我一开始也搞不清楚),其实n命令就是读入下一行数据,在“ seq 10 | sed 'n;p' ”这里就是读入“ 4 ”,那原来的“ 3 ”怎么办呢(关键),sed会默认把不要的数据丢到stdout(标准输出,也就是屏幕)那里,所以就会在屏幕上打印出第四行数据“ 3 ”;得到了第四个输出然后命令还没结束!

  刚刚执行的是“ n;p ”命令的 n ,接下来就到 p 了,p 就是直接打印 sed 缓冲区的内容,现在缓冲区里面是“ 4 ”,所以直接打印“ 4 ”,现在我们的屏幕就有了5行数据了,分别是第一行:1,第二行:2,第三行:2,第四行:3,第五行:4

  第二轮 sed 'n;p' 执行完毕。

  剩下来的都和上面一样我就不啰嗦了(第一次写这么多,有点累了-_-||)

  以上就是对 seq 10 | sed 'n;p' 命令的详细分析

再贴一次结果:

第二个命令:seq 10 | sed -n 'n;p'

  第二个命令与第一个命令几乎一样,只是 sed 多了一个选项 -n ,(相信只要理解了第一个命令,现在这个就so easy了)

  首先理解 -n 的意思,就是只打印处理过的数据,在这里再通俗点说就是sed缓冲区里不要的数据就不要丢到标准输出了,你爱丢哪丢哪!

  下面过一遍流程:

  第一轮 sed :

  seq 把生成的“ 1 ”传给 sed ,现在 sed 的处理缓冲区就有数据“ 1 ”,有了数据“ 1 ”之后 sed 便执行单引号里的“ n;p ”命令

  n和p用“ ; ”分隔,表示依次执行,所以先执行“ n ”命令,n命令的理解就很关键了(我一开始也搞不清楚),其实n命令就是读入下一行数据,在“ seq 10 | sed -n 'n;p' ”这里就是读入“ 2 ”,那原来的“ 1 ”怎么办呢(关键),这时 sed 就不会把“ 1 ”丢到标准输出了,所以屏幕上不会输出“ 1 ”,

  刚刚执行的是“ n;p ”命令的 n ,接下来就到 p 了,p 就是直接打印 sed 缓冲区的内容,现在缓冲区里面是“ 2 ”,所以直接打印“ 2 ”,现在我们的屏幕就有1行数据了,第一行:2

  第一轮 sed 'n;p' 执行完毕。

  第二轮 sed :

  与上面上第一轮的差不多,如下:

  seq 把生成的“ 3 ”传给 sed ,(关键)sed 的缓冲区里面现在有“ 2 ”’,然后现在又读入了新的“ 3 ”,这时 sed 就不会把“ 2 ”丢到标准输出了,所以屏幕上不会输出“ 2 ”,所以现在 sed 的处理缓冲区就有数据“ 3 ”,有了数据“ 3 ”之后 sed 便执行单引号里的“ n;p ”命令

  n和p用“ ; ”分隔,表示依次执行,所以先执行“ n ”命令,n命令的理解就很关键了,其实n命令就是读入下一行数据,在“ seq 10 | sed 'n;p' ”这里就是读入“ 4 ”,那原来的“ 3 ”怎么办呢(关键),sed 也不会把“ 2 ”丢到标准输出了,所以屏幕上也不会输出“ 2 ,”然后命令还没结束!

  刚刚执行的是“ n;p ”命令的 n ,接下来就到 p 了,p 就是直接打印 sed 缓冲区的内容,现在缓冲区里面是“ 4 ”,所以直接打印“ 4 ”,现在我们的屏幕就有了5行数据了,分别是第一行:2,第二行:4

  第二轮 sed 'n;p' 执行完毕。

再贴一次结果:

相信看到这里的童鞋都应该有所收获了,如果没有那一定是我的问题,对不起!!!

剩下两个命令我觉得就没有必要再啰嗦了,相信大家可以自行推导,如果还有什么不懂的可以私信我,看到就回!

第一次码这么多字,希望能对大家有所帮助,在此特地感谢李老师的讲解,可以说全是他的深入讲解的功劳!!!

 码字不易,你们的

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

深入理解sed模式空间——sed ‘n;p‘ 的相关文章

  • 动态加载库和共享全局符号

    由于我在动态加载的库中观察到全局变量的一些奇怪行为 因此我编写了以下测试 首先我们需要一个静态链接库 头文件test hpp ifndef BASE HPP define BASE HPP include
  • 如何在 Linux 中显示进程状态(阻塞、非阻塞)

    有没有办法查询 Linux 进程表中进程的状态 以便能够演示执行查询时进程是正在运行还是被阻止 我的目标是从进程或程序的 外部 执行此操作 因为我希望从操作系统进程的角度来理解这一点 但欢迎任何想法 这是Python代码阻塞的过程 impo
  • 选择多个模式的 awk 代码

    这是我的输入文件 比如modified txt r4544 n479826 2012 08 28 07 12 33 0400 Tue 28 Aug 2012 1 line Changed paths M branches 8 6 0 con
  • /usr/bin/as:无法识别的选项“-EL”

    因此 在为我的1plus手机编译android内核时 经过3天的多次尝试 我放弃了并尝试在这里询问是否有人以前遇到过这个问题 这个错误对我来说有点模糊 但我觉得问题来自于我最近对 GNU Linux 发行版 Gentoo 的更改 它在不应该
  • BlueZ D-Bus C,应用 BLE

    我正在尝试编写一个应用程序来搜索附近的蓝牙设备并与它们通信 我的应用程序将用 C 语言编写 并打算在 Linux 下工作 是否有通过 C 中的 D Bus 使用 BlueZ 的教程或示例 此应用程序的目的是从 BLE 中的文件发送数据 你能
  • 如何获取文件夹的大小,包括稀疏文件的表观大小? (du太慢了)

    我有一个包含很多KVM qcow2文件的文件夹 它们都是稀疏文件 现在我需要获取文件夹的总大小 qcow2 文件大小应计为表观大小 而不是实际大小 例如 图片 c9f38caf104b4d338cc1bbdd640dca89 qcow2 文
  • 查找当前打开的文件句柄数(不是 lsof )

    在 NIX系统上 有没有办法找出当前正在运行的进程中有多少个打开的文件句柄 我正在从正在运行的进程中寻找在 C 中使用的 API 或公式 在某些系统上 见下文 您可以在 proc pid fd 中对它们进行计数 如果不属于其中之一 请参阅下
  • 在Linux中执行jar文件[关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我创建了一个可执行的 Java jar 文件 也就是说 我将 java 程序正确打包到 jar 文件中 包括 META INF MANIFEST 文件
  • 检查上次更改密码的时间[关闭]

    Closed 这个问题是与编程或软件开发无关 help closed questions 目前不接受答案 Locked 这个问题及其答案是locked help locked posts因为这个问题是题外话 但却具有历史意义 目前不接受新的
  • 带有接收器的 boost_log 示例无法编译

    我正在考虑将 boost log 用于一个项目 一开始我就遇到了以下问题 我在以下位置找到的升压日志示例 http www boost org doc libs 1 54 0 libs log example doc tutorial fi
  • “以下软件包将被更高优先级的频道取代”是什么意思?

    我正在尝试将 fuzzywuzzy 安装到 64 位 Linux 中的 Anaconda 发行版上 当我这样做时 它试图改变我的conda and conda env to conda forge渠道 如下 我通过以下方式在 anacond
  • 多线程进程的线程ID可以与另一个正在运行的进程的进程ID相同吗?

    我正在尝试找到一种方法来唯一标识多进程环境中的线程 我有一个服务器 它跟踪连接到它的不同进程 其中一些是多线程的 一些不是 为了识别多线程连接中的线程 我使用线程 ID 作为唯一标识符 在任何给定时间最多有 1 个多线程进程连接 我的问题是
  • 如何使用 bash 粘贴来自单独文件的列?

    我想用分隔符 合并不同的列表 第一个列表有 2 个单词 cat first one who 第二个列表有 10000 个单词 cat second languages more simple advanced home expert tes
  • 如何每周日运行 crontab 作业

    我想弄清楚如何每周周日运行 crontab 作业 我认为以下应该可行 但我不确定我是否理解正确 下面的说法正确吗 5 8 6 这是 crontab 格式的解释 1 Entry Minute when the process will be
  • 如何在 .zip 文件中使用 grep

    有 3 个文件 a csv b csv c csv 压缩为 abh zip 现在可以在 abh zip 上执行 grep 命令 是否有任何通配符 仅对里面的 c csv 文件运行 grep压缩 如果你有zipgrep 据我所知 它是随zip
  • 分割 tar.bz2 文件并单独提取每个文件

    我可以将一个大的 tar bz2 文件分割成几个较小的文件并在 Ubuntu 中单独提取这些小 tar bz2 文件吗 Thanks 我认为这不容易实现 A tar bz2是单个流 它没有像这样的索引zip这将允许跳到存档中特定文件的开头
  • 仅为我自己禁用和重新启用地址空间布局随机化

    我想在我的系统 Ubuntu Gnu Linux 2 6 32 41 server 上禁用地址空间布局随机化 ASLR 但是 如果我使用 sysctl w kernel randomize va space 0 我认为这一更改将影响系统上的
  • copy_from_user() 错误:目标大小太小

    我正在为内核模块编写 ioctl 处理程序 我想从用户空间复制数据 当我编译禁用优化的代码时 O0 gflags 编译器返回以下错误 include linux thread info h 136 17 error call to bad
  • 未找到 DEADLINE 调度策略

    我想在 C 中实现 DEADLINE 调度策略 我知道该功能已实现Linux 3 14 10我正在使用 Ubuntu 14 04Linux 3 17 0 031700 lowlatency 201410060605 SMP PREEMPT这
  • 如何在 Linux 上重新实现(或包装)系统调用函数?

    假设我想完全接管 open 系统调用 也许要包装实际的系统调用并执行一些日志记录 一种方法是使用 LD PRELOAD http scaryreasoner wordpress com 2007 11 17 using ld preload

随机推荐

  • linux参数传入awk,linux awk命令--如何引入外部变量

    目标 用shell命令删除目录下文件 但是排除某些特殊文件 第一时间无脑从谷歌获取 rm ls txt grep v test txt 或者 rm ls txt egrep v test txt 或者 rm ls txt awk if 0
  • python实现新闻网站_如何利用 Python 爬虫实现给微信群发新闻早报?(详细)

    1 场景 经常有小伙伴在交流群问我 每天的早报新闻是怎么获取的 其实 早期使用的方案 是利用爬虫获取到一些新闻网站的标题 然后做了一些简单的数据清洗 最后利用 itchat 发送到指定的社群中 由于爬虫面对 网站改版的不稳定性及 itcha
  • 全额限定名

    全额限定名说白了就是路径名 全额限定名 java lang String class文件中就是 java lang String pathname2classname classname2pathname
  • java 异常 理解_java异常理解(1)

    JAVA异常处理机制 1引子 try catch finally恐怕是大家再熟悉不过的语句了 而且感觉用起来也是很简单 逻辑上似乎也是很容易理解 不过 我亲自体验的 教训 告诉我 这个东西可不是想象中的那么简单 听话 不信 那你看看下面的代
  • 光流估计(对视频处理+python实现+原理+实验报告)

    资源 光流估计 对视频处理 python实现 原理 实验报告 实现效果 相关原理 光流是空间运动物体在观测成像平面上的像素运动的 瞬时速度 根据各个像素点的速度矢量特征 可以对图像进行动态分析 例如目标跟踪 亮度恒定 同一点随苕时间的变化
  • 植被物候参数遥感研究进展(好文分享)

    在气候变化背景下 植被物候作为生态系统对环境变化响应的直接体现方式 日益受到学界关注 获取长期 连续 多尺度的植被物候数据是物候研究的基础 而利用卫星遥感手段获取的物候参数已经成为陆地生态系统变化研究的重要指标 遥感物候参数在农业生产管理
  • 530 Please login with USER and PASS.

    安装 npm install save hexo deployer ftpsync 配置 deploy type ftpsync host xx xx xx xx user bxu123123 pass xx11123 remote htd
  • C++ RSA加解密

    原文链接 https blog csdn net u011029517 article details 79392522 之前需要用到RSA加解密的时候花费了我不少的时间 网上有很多RSA加解密的文章 但大多数都是从文件读取公钥或者私钥的
  • 字节跳动五面都过了,结果被刷了,问了hr原因竟说是...

    摘要 说在前面 面试时最好不要虚报工资 本来字节跳动是很想去的 几轮面试也通过了 最后没offer 自己只想到几个原因 1 虚报工资 比实际高30 2 有更好的人选 这个可能性不大 我看还在招聘 我是面试Android开发的 3年经验 下面
  • linux clamav 免费查毒工具

    linux下需要杀毒工具吗 我一直认为是不要的 基于linux的病毒很少 linux 安全防护也做的很好 一般很难功破 我想那些 们更喜欢 写windows下的病毒 用的人多啊 传播也容易 下面的操作 都是以管理员的身份来进行的 一 安装c
  • Java各种系统架构图及其简介

    1 spring架构图 Spring是一个开源框架 是为了解决企业应用程序开发复杂性而创建的 框架的主要优势之一就是其分层架构 分层架构允许您选择使用哪一个组件 同时为J2EE应用程序开发提供集成的框架 Spring框架的功能可以用在任何J
  • 使用Xshell7控制多台服务同时安装ZK最新版集群服务

    一 环境准备 主机名称 主机IP 节点 集群内通讯端口 选举leader clinet端提供服务 端口 docker0 192 168 1 100 node 0 2888 3888 2181 docker1 192 168 1 101 no
  • 61.(前端)权限管理实现——从数据库中获取数据展示在前端,使用插槽和Tag标签美化数据展示

    1 概述 本次内容 主要是对用户权限列表进行展示 2 基本流程 在component文件夹下创建power文件夹 并在power文件夹下创建Menu vue 在Menu vue任意编写显示内容 用于测试 去router index js挂载
  • 解决Scrapy使用pipline保存到数据库后返回None

    这也不算报错哈 解决方法 在process item处理完成后返回item即可 return item 案例分析 比如下面的pipeline class MyPipeline object def init self host 127 0
  • Flask 实现文件上传和下载(简单但实用)

    目录结构和代码 root master w upload ll total 4 0K drwxr xr x 3 root root 21 Jul 2 17 32 static drwxr xr x 2 root root 25 Jul 5
  • Android在EditText中只能输入中文或者指定类型的内容

    之前做过一个需求 在EditText中只能输入中文或者英文字符不能输入特殊字符和数字等一些其他内容 查阅了一些资料 需要重写一下EditText中的相关方法就可以完成该功能 总结一下 方便之后使用 看一下效果图 可以看到在EditText中
  • Redis系列之二:Redis基础知识

    引言 正所谓万丈高楼平地起 学习一项技术都需要从其基础知识开始 上一篇介绍了Redis在Linux环境下的安装步骤 本文主要介绍了Redis的基础知识 包括数据结构以及常用命令等 废话不多说 我们直接开始吧 Redis基础数据结构 Redi
  • GPT-4 的创造力全方位持平或碾压人类

    文章目录 一 前言 二 主要内容 三 总结 CSDN 叶庭云 https yetingyun blog csdn net 一 前言 最近 一项有关 GPT 4 的创造力思维测试火了 来自蒙大拿大学和 UM Western 大学的研究团队发现
  • 工作——自动化测试中用到的SQL server查询语句的格式调整

    SELECT CONVERT VARCHAR 100 GETDATE 0 05 16 2006 10 57AM SELECT CONVERT VARCHAR 100 GETDATE 1 05 16 06 SELECT CONVERT VAR
  • 深入理解sed模式空间——sed ‘n;p‘

    在进入正题之前我们先来了解一下sed的模式空间 如下 什么是sed的模式空间 答 仅供参考 就是从文件读取一行文本然后存入的缓冲区 然后命令操作模式空间的内容 在初始状态下模式空间是没有内容的 在每次循环读取数据的过程中 模式空间都会被清空