使用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
来获取文本。
也许这就是你真正想要的?找到与“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=//'
......哎呀,也许我的信任失败了。)
在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中的所有先前操作。
很少使用分支命令会为你做这个。在你匹配之前,使用n代表next然后分支到开头。匹配后,使用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"***
而是更改管道的最后两个段,以便:
zcat file* | sed -e 's/.*text=\(.*\)status=[^/]*/\1/' | **awk '$1 ~ "pattern" {print $0}'**