为了账号安全,请及时绑定邮箱和手机立即绑定

使用sed或awk打印符合匹配模式的线条

使用sed或awk打印符合匹配模式的线条

使用sed或awk打印符合匹配模式的线条问题:我想直接在包含匹配模式的一行后面打印一行。我的版本sed将不会采用以下语法(它会破坏+1p)这似乎是一个简单的解决方案:sed -n '/ABC/,+1p' infile我想awk做多行处理会更好,但我不知道怎么做。
查看完整描述

3 回答

?
缥缈止盈

TA贡献2041条经验 获得超4个赞

不要使用“模式”这个词,因为它是高度模棱两可的。始终使用“String”或“regexp”(或在shell中使用“globing模式”),无论它的真正意思是什么。

你想要的具体答案是:

awk 'f{print;f=0} /regexp/{f=1}' file

或者专门化在regexp之后的Nth记录的更通用的解决方案(下面是习语“c”):

awk 'c&&!--c; /regexp/{c=1}' file

以下成语描述了如何选择给定特定regexp以匹配的一系列记录:

(A)打印来自某个regexp的所有记录:

awk '/regexp/{f=1}f' file

(B)在某些正则表达式之后打印所有记录:

awk 'f;/regexp/{f=1}' file

c)在某些regexp之后打印Nth记录:

awk 'c&&!--c;/regexp/{c=N}' file

d)在某些regexp之后打印除第N条记录外的所有记录:

awk 'c&&!--c{next}/regexp/{c=N}1' file

(E)在某些regexp之后打印N个记录:

awk 'c&&c--;/regexp/{c=N}' file

(F)打印除N条记录外的每一条记录。

awk 'c&&c--{next}/regexp/{c=N}1' file

(G)从某些regexp打印N条记录:

awk '/regexp/{c=N}c&&c--' file

在适当的情况下,我将变量名从“f”改为“c”,表示“count”,因为这更能表达变量的实际情况。


查看完整回答
反对 回复 2019-06-18
?
翻翻过去那场雪

TA贡献2065条经验 获得超13个赞

是这条线你感兴趣的匹配,对吧?在sed中,可以这样做:

sed -n '/ABC/{n;p}' infile

或者,GREP的A选择可能就是你要找的。

-A NUM, Print NUM lines of trailing context after matching lines.

例如,给定以下输入文件:

foo
bar
baz
bash
bongo

您可以使用以下内容:

$ grep -A 1 "bar" file
bar
baz
$ sed -n '/bar/{n;p}' file
baz

希望能帮上忙。


查看完整回答
反对 回复 2019-06-18
?
跃然一笑

TA贡献1826条经验 获得超6个赞

我需要在模式之后打印所有的行(OK,Ed,REGEX),所以我确定了这一条:

sed -n '/pattern/,$p' # prints all lines after ( and including ) the pattern

但因为我想打印后面的所有线条(并排除图案)

sed -n '/pattern/,$p' | tail -n+2  # all lines after first occurrence of pattern

我想在你的例子中你可以添加一个head -1最后

sed -n '/pattern/,$p' | tail -n+2 | head -1 # prints line after pattern


查看完整回答
反对 回复 2019-06-18
  • 3 回答
  • 0 关注
  • 658 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信