Sed : print all lines after match

时间:2015-09-14 15:58:34

标签: regex unix sed

I got my research result after using sed :

zcat file* | sed -e 's/.*text=\(.*\)status=[^/]*/\1/' | cut -f 1 - | grep "pattern"

But it only shows the part that I cut. How can I print all lines after a match ?

I'm using zcat so I cannot use awk.

Thanks.

Edited :

This is my log file :

[01/09/2015 00:00:47]       INFO=54646486432154646 from=steve   idfrom=55516654455457       to=jone       idto=5552045646464 guid=100021623456461451463   n
um=6    text=hi my number is 0 811 22 1/12   status=new      survstatus=new

My aim is to find all users that spam my site with their telephone numbers (using grep "pattern") then print all the lines to get all the information about each spam. The problem is there may be matches in INFO or id, so I use sed to get the text first.

5 个答案:

答案 0 :(得分:26)

sed中匹配后打印所有行:

$ sed -ne '/pattern/,$ p'
  # alternatively, if you don't want to print the match:
$ sed -e '1,/pattern/ d'

当“text =”和“status =”之间的模式匹配时,可以使用简单的grep过滤行,不需要sedcut

$ grep 'text=.*pattern.* status='

答案 1 :(得分:5)

或者您可以使用awk

awk '/pattern/,EOF'

也许可以与awk中的所有先前操作结合起来。

答案 2 :(得分:5)

也许这就是你真正想要的?找到与“模式”匹配的行,并在text=之后status=之后提取字段?

zcat file* | sed -e '/pattern/s/.*text=\(.*\)status=[^/]*/\1/'

你没有透露pattern实际上是什么 - 如果它是一个变量,你就不能在它周围使用单引号。

请注意,\(.*\)status=[^/]*会在您的示例中通过survstatus=new匹配。那可能不是你想要的?似乎没有status=后跟任何斜线 - 你真的应该更详细地解释你实际上想要实现的目标。

你的问题标题是“匹配后的所有行”所以也许你想要text=之后的所有内容?那就是

sed 's/.*text=//'

即。通过text=无需更换,并保留其余部分。 (我相信你可以弄清楚如何将周围的脚本更改为zcat file* | sed '/pattern/s/.*text=//' ... oops,也许我的信任失败了。)

答案 3 :(得分:3)

很少使用分支命令会为你做这个。在你匹配之前,使用n代表next然后分支到开头。匹配后,使用n跳过匹配的行,然后循环复制剩余的行。

cat file | sed -n -e ':start; /pattern/b match;n; b start; :match n; :copy; p; n ; b copy'

答案 4 :(得分:0)

zcat file* | sed -e 's/.*text=\(.*\)status=[^/]*/\1/' | ***cut -f 1 - | grep "pattern"***

而是更改管道的最后两个段,以便:

zcat file* | sed -e 's/.*text=\(.*\)status=[^/]*/\1/' | **awk '$1 ~ "pattern" {print $0}'**