2015-11-05 55 views
-1

我有下面的代碼:分割在幾個部分文本(UNIX)

mutate { 
    add_field => [ "NB_timestamp", "%{SYS_YEAR}/%{SYS_MONTH}/%{SYS_DAY} %{SYS_HOUR}:%{SYS_MIN}:%{SYS_SEC}" ] 
    } 

if [type] == "batch" { 
    if [idx] != "sipp" { 
    mutate { 
    add_field => [ "idx", "sipp"] 
    } 
    } 
    if [message] == "" { 
    drop { } 
    } 
} 

mutate { 
    add_field => [ "NB_timestamp", "%{SYS_YEAR}/%{SYS_MONTH}/%{SYS_DAY} %{SYS_HOUR}:%{SYS_MIN}:%{SYS_SEC}" ] 
    } 

我想獲得發生變異的部分。那就是,在這種情況下,我想只得到兩個部分:

  • 發生變異{ add_field => [ 「NB_timestamp」, 「%{SYS_YEAR} /%{SYS_MONTH} /%{SYS_DAY} %{SYS_HOUR}:%{SYS_MIN}:%{SYS_SEC}」]}

  • 發生變異{ add_field => [ 「NB_timestamp」, 「%{SYS_YEAR} /%{SYS_MONTH} /%{SYS_DAY} %{SYS_HOUR}:%{SYS_MIN}:%{SYS_SEC}」]}

未這一部分:

  • 發生變異{ add_field => [ 「IDX」, 「SIPP」] }

我已經使用grep,AWK和切試過。問題是這些命令(grep,awk和cut)得到「mutate」這是在「如果[type]」也是。

實施例:

  • SED -n 「/轉變\ {/,/}/P」 file.txt的

輸出:

mutate { 
     add_field => [ "NB_timestamp", "%{SYS_YEAR}/%{SYS_MONTH}/%{SYS_DAY} %{SYS_HOUR}:%{SYS_MIN}:%{SYS_SEC}" ] 

mutate { 
     add_field => [ "idx", "sipp"] 
     } 

mutate { 
     add_field => [ "NB_timestamp", "%{SYS_YEAR}/%{SYS_MONTH}/%{SYS_DAY} %{SYS_HOUR}:%{SYS_MIN}:%{SYS_SEC}" ] 

由於提前,

問候。

+1

不要讓我們猜是什麼** Mutate的一部分**。根據上面的代碼/輸入,請編輯您的問題以顯示您所需的輸出?此外,你應該包括你試圖解決你的問題,最接近的輸出和任何錯誤消息。祝你好運。 – shellter

+0

謝謝,我剛剛修改了我的問題。我希望這個問題能很好的配製。乾杯。 – RdrgPorto

回答

0

您可以用sed提取通緝發生變異的部分:

sed -n '/^mutate {/,/ }/p' file.txt 

結果應該是:

mutate { add_field => [ "NB_timestamp", "%{SYS_YEAR}/%{SYS_MONTH}/%{SYS_DAY} %{SYS_HOUR}:%{SYS_MIN}:%{SYS_SEC}" ] } mutate { add_field => [ "NB_timestamp", "%{SYS_YEAR}/%{SYS_MONTH}/%{SYS_DAY} %{SYS_HOUR}:%{SYS_MIN}:%{SYS_SEC}" ] }

0

爲您實際的例子:

awk '/}$/{f=0}f;/^mutate/{f=1}' file 

結果:

add_field => [ "NB_timestamp", "%{SYS_YEAR}/%{SYS_MONTH}/%{SYS_DAY} %{SYS_HOUR}:%{SYS_MIN}:%{SYS_SEC}" ] 
add_field => [ "NB_timestamp", "%{SYS_YEAR}/%{SYS_MONTH}/%{SYS_DAY} %{SYS_HOUR}:%{SYS_MIN}:%{SYS_SEC}" ] 

要獲取所有實體改旗順序:

awk '/^mutate/{f=1}f;/}$/{f=0}' file 

結果:

mutate { 
    add_field => [ "NB_timestamp", "%{SYS_YEAR}/%{SYS_MONTH}/%{SYS_DAY} %{SYS_HOUR}:%{SYS_MIN}:%{SYS_SEC}" ] 
    } 
mutate { 
    add_field => [ "NB_timestamp", "%{SYS_YEAR}/%{SYS_MONTH}/%{SYS_DAY} %{SYS_HOUR}:%{SYS_MIN}:%{SYS_SEC}" ] 
    } 

說明:https://nixtip.wordpress.com/2010/10/12/print-lines-between-two-patterns-the-awk-way/

+0

謝謝,有一個問題,我怎麼能用mutate來獲得呢?也就是說:mutate {add_field => [「NB_timestamp」,「%{SYS_YEAR} /%{SYS_MONTH} /%{SYS_DAY}%{SYS_HOUR}:%{SYS_MIN}:%{SYS_SEC}」]} – RdrgPorto

+0

請參閱我編輯的回答@RdrgPorto – klashxx