使用后我得到了我的研究结果
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
首先获取文本。
要打印第一个匹配项之后(包括第一个匹配项)的所有行:
$ 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='
您可以使用
awk
awk '/pattern/,EOF'
n.b.不要被愚弄:EOF 只是一个未初始化的变量,默认情况下为 0(假)。因此,直到文件末尾才能满足该条件。
也许这也可以使用 awk 与之前的所有答案结合起来。
也许这就是你真正想要的?查找与“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=//'
...哎呀,也许我的信任失败了。)
很少使用的分支命令将为您完成此操作。在匹配之前,使用 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}'**
只需使用:grep -A$numberoflines "Word" file 如果您不知道行数,请使用 wc -l