2015-09-14 139 views
4

后,我得到了我使用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来获取文本。

+0

你能用预期的输出显示'zcat'的示例输出吗? – anubhava

+1

“我正在使用zcat,所以我不能使用awk。”等等,什么? –

+0

目前还不清楚你正在试图获得什么输出。 – tripleee

回答

1

也许这是你真正想要什么?找到与“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=//' ...哎呀,也许我的信任失败了。)

+0

谢谢,这个作品! – brest1007

+0

其实你可能想''| sed -n'/.../s/.../.../p''仅打印提取的行。 Awk也很容易做到这一点;不知道为什么你认为你不能使用Awk。 – tripleee

14

打印赛后所有行sed

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

滤波线时,图案之间匹配的“文本=”和“状态=”可以用一个简单的grep来完成,不需要sedcut

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

这不起作用,它会打印每一行 – brest1007

+1

/pattern /之后的每一行。 –

+0

我编辑了我的问题,我尝试了您的解决方案,但它也匹配INFO或ID提交,所以它仍然无法正常工作。 – brest1007

0

或者您可以使用awk

awk '/pattern/,EOF' 

也许可以与awk中的所有以前的操作结合使用。

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

,而不是改变你的管道的最后2段,因此:

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

很少使用的分支命令会为你做这个。直到你匹配,用n代表下一个分支开始。匹配后,使用n跳过匹配的行,然后循环复制其余的行。

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