拆分几个部分的文本(Unix)

时间:2015-11-05 10:00:18

标签: bash unix awk grep cut

我有下一个代码:

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}" ]
   }

我想获得 mutate的部分。也就是说,在这种情况下,我只想获得两个部分:

  • 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}" ]}

不是这一部分:

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

我尝试过使用grep,awk和cut。问题是这些命令(grep,awk和cut)得到" mutate" ,它位于"如果[type]"

示例:

  • 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 => [ "idx", "sipp"]
       }

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

提前致谢,

问候。

2 个答案:

答案 0 :(得分: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/

答案 1 :(得分:0)

你可以使用sed来提取想要的mutate的部分:

   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}" ] }