在bash中重复多线模式

时间:2018-02-23 22:04:30

标签: bash awk grep

我想用bash

获取多行模式

我有一个使用cmd | tee >(grep 552) | grep 210的方法可以工作,但它会吐出所有的552,然后是所有的210。如果用相应的210's吐出成对的552,它会更容易阅读。

这是我在python中的方式,但我还没弄明白如何在bash中做到这一点。可能是一些awk / grep命令?

Python示例:

(552)(.*)(.|\n|\r)*?(210)(.*)

或者指定非捕获,将是:

(?:552)(.*)(?:.|\n|\r)*?(?:210)(.*)

示例输入:

properties 552 I want
220 a logg don't want this
props 210 These
...
552 And these
...
ex 210 too

示例输出:

I want
These

And these
too

也没关系:

properties 552 I want
props 210 These

552 And these
ex 210 too

3 个答案:

答案 0 :(得分:1)

看起来,您可以使用sed进行更改:

sed -nE 's/^.*(552|210) *//p' file

I want
These
And these
too

如果这不是您正在寻找的内容,那么我建议您发布预期输出的不同样本输入。

答案 1 :(得分:0)

考虑这个示例输入文件:

$ cat file
552 Start1
123 other
210 End1
123 other
123 other
552 Start2
210 End2

使用awk

$ awk '/552/,/210/' file
552 Start1
123 other
210 End1
552 Start2
210 End2

使用sed

$ sed -n '/552/,/210/p' file
552 Start1
123 other
210 End1
552 Start2
210 End2

使用GNU grep

$ grep -ozP '552(.|\n|\r)*?210[^\n]*\n' file
552 Start1
123 other
210 End1
552 Start2
210 End2

答案 2 :(得分:0)

如果您不需要开始和结束模式之间的界线

$ awk '/^552\y/ && ORS=OFS;  
       /^210\y/ && ORS=RS' file

将给出(使用@ John1024'输入文件)

552 Start1 210 End1
552 Start2 210 End2

或者,如果你想要它们在不同的行上

$ awk '/^552\y/ || /^210\y/'

552 Start1
210 End1
552 Start2
210 End2

如果你正在寻找第一场的确切文字匹配,也许写$1=="552" || $1=="210"会更好。