簡體   English   中英

Sed:匹配后打印所有行

[英]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 ,不需要sedcut

$ 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM