2015-09-14 120 views
4

後,我得到了我使用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來獲取文本。

+0

你能用預期的輸出顯示'zcat'的示例輸出嗎? – anubhava

+1

「我正在使用zcat,所以我不能使用awk。」等等,什麼? –

+0

目前還不清楚你正在試圖獲得什麼輸出。 – tripleee

回答

1

也許這是你真正想要什麼?找到與「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=//' ...哎呀,也許我的信任失敗了。)

+0

謝謝,這個作品! – brest1007

+0

其實你可能想''| sed -n'/.../s/.../.../p''僅打印提取的行。 Awk也很容易做到這一點;不知道爲什麼你認爲你不能使用Awk。 – tripleee

14

打印賽後所有行sed

$ sed -ne '/pattern/,$ p' 
    # alternatively, if you don't want to print the match: 
$ sed -e '1,/pattern/ d' 

濾波線時,圖案之間匹配的「文本=」和「狀態=」可以用一個簡單的grep來完成,不需要sedcut

$ grep 'text=.*pattern.* status=' 
+0

這不起作用,它會打印每一行 – brest1007

+1

/pattern /之後的每一行。 –

+0

我編輯了我的問題,我嘗試了您的解決方案,但它也匹配INFO或ID提交,所以它仍然無法正常工作。 – brest1007

0

或者您可以使用awk

awk '/pattern/,EOF' 

也許可以與awk中的所有以前的操作結合使用。

0
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}'** 
3

很少使用的分支命令會爲你做這個。直到你匹配,用n代表下一個分支開始。匹配後,使用n跳過匹配的行,然後循環複製其餘的行。

cat file | sed -n -e ':start; /pattern/b match;n; b start; :match n; :copy; p; n ; b copy'