繁体   English   中英

Sed:匹配后打印所有行

[英]Sed : print all lines after match

使用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获取文本。

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

或者你可以使用awk

awk '/pattern/,EOF'

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

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

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

您没有透露实际是什么pattern ——如果它是一个变量,则不能在其周围使用单引号。

请注意, \\(.*\\)status=[^/]*将通过survstatus=new在您的示例中匹配。 那可能不是您想要的? 似乎任何地方都没有status=后跟斜杠——你真的应该更详细地解释你实际想要完成的事情。

您的问题标题说“匹配后的所有行”,所以也许您想要text=之后的所有text= 那简直就是

sed 's/.*text=//'

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

很少使用的分支命令将为您完成此操作。 在匹配之前,使用 n 表示下一个然后分支到开始。 匹配后,使用 n 跳过匹配的行,然后循环复制剩余的行。

cat file | sed -n -e ':start; /pattern/b match;n; b start; :match n; :copy; p; n ; b copy'
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}'**

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM