首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >只有cat从特定行X(带模式)到其他特定行Y(带模式)

只有cat从特定行X(带模式)到其他特定行Y(带模式)
EN

Unix & Linux用户
提问于 2014-09-02 02:23:33
回答 2查看 3.5K关注 0票数 3

在一个巨大的文件上,猫行x到y行”中的一个小扩展问题:

我有一个巨大的文件(2-3 GB)。我只想从有"foo:“的行到有"goo:”的行打印cat/打印。假设"foo:“和"goo:”只在文件中出现一次;"foo:“收益"goo:”。

到目前为止,这是我的方法:

  • 首先,查找带有"foo:“和"goo:":grep -nr "foo:" bigfile的行
  • 返回123456: foo: hello world!654321: goo: good bye!
  • 一旦我知道了这些起始行号和结束行号,以及差异(654321-123456=530865),我就可以做选择性cat:
  • tail -n+123456 bigfile | head -n 530865

我的问题是,如何用表达式(例如grep .)有效地替换行数常量?

我可以编写一个简单的Python脚本,但我只想使用组合命令来实现它。

EN

回答 2

Unix & Linux用户

发布于 2014-09-02 02:29:11

代码语言:javascript
复制
sed -n '/foo/,/goo/p;/goo/q' <bigfile

只会打印那些线条。如果您想要行号,可以添加一个=

代码语言:javascript
复制
sed -n '/foo/=;/goo/=;//q' <bigfile

q很重要,因为当它被调用时,q会使用输入--否则sed会一直读到最后。

如果不想打印foo/goo行,则可以这样做:

使用GNU sed

代码语言:javascript
复制
sed -n '/foo/,/goo/!d;//!p;/goo/q
' <<\DATA
line1
foo 
line3
line4
line5
goo 
line7
DATA

输出

代码语言:javascript
复制
line3
line4
line5

与任何其他人:

代码语言:javascript
复制
sed -n '/foo/G;/\n/,/goo/!d;//q;/\n/!p 
' <<\DATA
line1
foo 
line3
line4
line5
goo 
line7
DATA    

输出

代码语言:javascript
复制
line3
line4
line5

但是,无论哪种方式,当它遇到搜索中的最后一行时,它也会退出它的输入。

票数 9
EN

Unix & Linux用户

发布于 2014-09-02 08:46:11

备选sed one:

代码语言:javascript
复制
sed '/foo/,$!d;/goo/q'
票数 4
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/153239

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档