![类似 Grep 的工具,用于显示文本相对于模式的特定区域](https://linux22.com/image/84881/%E7%B1%BB%E4%BC%BC%20Grep%20%E7%9A%84%E5%B7%A5%E5%85%B7%EF%BC%8C%E7%94%A8%E4%BA%8E%E6%98%BE%E7%A4%BA%E6%96%87%E6%9C%AC%E7%9B%B8%E5%AF%B9%E4%BA%8E%E6%A8%A1%E5%BC%8F%E7%9A%84%E7%89%B9%E5%AE%9A%E5%8C%BA%E5%9F%9F.png)
我经常发布这样的短信:
pose:
-
position:
x: 0.0
y: 0.0
z: 0.0
orientation:
x: 0.0
y: 0.0
z: 0.0
w: 1.0
-
position:
x: 0.350104982508
y: 0.729534356813
z: -3.10228873344e-06
orientation:
x: -9.84128404362e-07
y: -1.996909502e-06
z: -0.447019362477
w: 0.894524281149
-
position:
x: 0.455011
y: -1.59228
z: 0.0
orientation:
x: 0.0
y: 0.0
z: 0.0
w: 1.0
我想将它通过管道传输到 grep 或任何其他类似的工具,以便显示从“pose:”之后的 12 行开始到“pose:”之后的 20 行的区域。 grep 的基本命令只允许在“pose:”之前或之后显示 n 行,在我的例子中,我想要显示的是这个子消息:
position:
x: 0.350104982508
y: 0.729534356813
z: -3.10228873344e-06
orientation:
x: -9.84128404362e-07
y: -1.996909502e-06
z: -0.447019362477
w: 0.894524281149
有没有任何命令行工具可以做到这一点?
答案1
awk '/^pose:/{s=NR+11} (NR>s && NR<s+10){print $0}'
当行以 , 开头时pose:
,s
设置为NR+11
。 ifNR
大于s
和小于s+10
行被打印。
答案2
答案已替换:
基本上就是从“之后的所有 20 行”中减去“之后的 5 行”的问题
这是我的快速建议
diff <(grep 'pose:' filename -A 20) <(grep 'pose:' filename -A 5)
当然 diff 输出将包含一些额外的标题行和“<”符号,您可能需要过滤掉它们
不过,过滤掉这没什么大不了的
答案3
(grep -A 20 "pose:" file; echo "--")|grep -B 9 '^--'