将文本分成几个部分 (Unix)

Split a text in several parts (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}" ]
   }

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

不是这部分:

我尝试过使用 grep、awk 和 cut。问题是这些命令(grep、awk 和 cut)也得到 "mutate",它也在 "if [type]" 中。

示例:

输出:

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

提前致谢,

此致。

对于您的实际示例:

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/

您可以使用 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}" ] }