sed:如何打印匹配行之后的所有行?

问题描述 投票:0回答:6

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

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
6个回答
93
投票

要打印第一个匹配项之后(包括第一个匹配项)的所有行:

$ echo -ne 'apple\nbanana\ncherry\n' | sed -ne '/banana/,$ p'
banana
cherry

要打印第一个匹配项之后(但不包括)的所有行:

$ echo -ne 'apple\nbanana\ncherry\n' | sed -e '1,/banana/ d'
cherry

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

grep
来完成,不需要
sed
cut

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

18
投票

您可以使用

awk

awk '/pattern/,EOF'

n.b.不要被愚弄:EOF 只是一个未初始化的变量,默认情况下为 0(假)。因此,直到文件末尾才能满足该条件。

也许这也可以使用 awk 与之前的所有答案结合起来。


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=//'
...哎呀,也许我的信任失败了。)


3
投票

很少使用的分支命令将为您完成此操作。在匹配之前,使用 n 表示下一个,然后分支到开头。匹配后,使用 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"***

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

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

0
投票

只需使用:grep -A$numberoflines "Word" file 如果您不知道行数,请使用 wc -l

© www.soinside.com 2019 - 2024. All rights reserved.