[英]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.