Sed:匹配后打印所有行

问题描述 投票:5回答:5

使用sed后我得到了我的研究结果:

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

但它只显示了我削减的部分。如何在比赛后打印所有线?

我正在使用zcat所以我不能使用awk。

谢谢。

编辑:

这是我的日志文件:

[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

我的目标是找到所有用他们的电话号码(使用grep "pattern")垃圾邮件我的网站的用户,然后打印所有行以获取有关每个垃圾邮件的所有信息。问题是在INFO或id中可能存在匹配,所以我使用sed来获取文本。

regex unix sed
5个回答
5
投票

也许这就是你真正想要的?找到与“pattern”匹配的行,并在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=//' ......哎呀,也许我的信任失败了。)


27
投票

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='

5
投票

或者你可以使用awk

awk '/pattern/,EOF'

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


3
投票

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

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

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}'**
© www.soinside.com 2019 - 2024. All rights reserved.