首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >命令行-在已知确切行号的文件中显示周围的上下文行。

命令行-在已知确切行号的文件中显示周围的上下文行。
EN

Stack Overflow用户
提问于 2022-04-12 09:40:20
回答 4查看 109关注 0票数 -1

如何在文件中输出围绕特定已知行号(例如5)的N行(例如2)行?

代码语言:javascript
复制
cat >/tmp/file <<EOL
foo

bar

baz

qux

quux
EOL

# some command

预期产出:

代码语言:javascript
复制
bar

baz

qux
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2022-04-12 10:03:33

如果预先知道行数和行数,并且能够计算第一行的数目和最后一行的行数,则可以使用简单的GNU sed命令。

代码语言:javascript
复制
sed -n '3,7p' file.txt

将输出file.txt的第3、4、5、6和7行。

如果您想更改行号,那么我将按照下面的方式使用GNU AWK

代码语言:javascript
复制
awk 'BEGIN{n=5}NR==n-2,NR==n+2' file.txt

说明:我将n设为5,然后使用范围n-2第四行(包含)到n+2第四行(包括)选择行,不提供相当于给予{print}的动作。

票数 2
EN

Stack Overflow用户

发布于 2022-04-12 12:11:26

稳健、可移植和高效地打印上下文(目标线两侧的行数相同):

代码语言:javascript
复制
$ awk -v tgt=5 -v ctx=2 '
    BEGIN{beg=tgt-(ctx=="" ? bef : ctx); end=tgt+(ctx=="" ? aft : ctx)}
    NR==beg{f=1} f; NR==end{exit}
' file
bar

baz

qux

或目标行之前和之后的不同行数:

代码语言:javascript
复制
$ awk -v tgt=5 -v bef=2 -v aft=4 '
    BEGIN{beg=tgt-(ctx=="" ? bef : ctx); end=tgt+(ctx=="" ? aft : ctx)}
    NR==beg{f=1} f; NR==end{exit}
' file
bar

baz

qux

quux

特别是关于效率问题的说明:

  1. 计算开始/结束行号的数学是在BEGIN部分完成一次,而不是每次读取一行时重新计算,并且
  2. NR==end{exit},而不是NR==end{f=0}或类似的,所以awk不会浪费时间,在打印所需的行之后不必要地读取输入文件的其余部分。
票数 1
EN

Stack Overflow用户

发布于 2022-04-12 09:40:20

没有行号前缀:

代码语言:javascript
复制
awk -v nr=5 'FNR>=nr-2 && FNR<=nr+3{ print $0 }' /tmp/file
代码语言:javascript
复制
bar

baz

qux

带有行号前缀:

代码语言:javascript
复制
awk -v nr=5 'FNR>=nr-2 && FNR<=nr+3{ print FNR":"$0 }' /tmp/file
代码语言:javascript
复制
3:bar
4:
5:baz
6:
7:qux
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71840390

复制
相关文章

相似问题

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