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

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

问题:我想直接在包含匹配模式的一行后面打印一行。

我的版本sed将不会采用以下语法(它会破坏+1p)这似乎是一个简单的解决方案:

sed -n '/ABC/,+1p' infile

我想awk做多行处理会更好,但我不知道怎么做。


牛魔王的故事
浏览 665回答 3
3回答

缥缈止盈

不要使用“模式”这个词,因为它是高度模棱两可的。始终使用“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}' filec)在某些regexp之后打印Nth记录:awk 'c&&!--c;/regexp/{c=N}' filed)在某些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”,因为这更能表达变量的实际情况。

翻翻过去那场雪

是这条线后你感兴趣的匹配,对吧?在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希望能帮上忙。

跃然一笑

我需要在模式之后打印所有的行(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
打开App,查看更多内容
随时随地看视频慕课网APP