I got my research result after using sed
:
zcat file* | sed -e 's/.*text=\(.*\)status=[^/]*/\1/' | cut -f 1 - | grep "pattern"
But it only shows the part that I cut. How can I print all lines after a match ?
I'm using zcat so I cannot use awk.
Thanks.
Edited :
This is my log file :
[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
My aim is to find all users that spam my site with their telephone numbers (using grep "pattern"
) then print all the lines to get all the information about each spam. The problem is there may be matches in INFO or id, so I use sed
to get the text first.
答案 0 :(得分:26)
在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='
答案 1 :(得分:5)
或者您可以使用awk
awk '/pattern/,EOF'
也许可以与awk中的所有先前操作结合起来。
答案 2 :(得分:5)
也许这就是你真正想要的?找到与“模式”匹配的行,并在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=//'
... oops,也许我的信任失败了。)
答案 3 :(得分:3)
很少使用分支命令会为你做这个。在你匹配之前,使用n代表next然后分支到开头。匹配后,使用n跳过匹配的行,然后循环复制剩余的行。
cat file | sed -n -e ':start; /pattern/b match;n; b start; :match n; :copy; p; n ; b copy'
答案 4 :(得分:0)
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}'**