2015-11-05 76 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