[英]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
,不需要sed
和cut
:
$ 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.