如果匹配,则提取多行

jes*_*e_b 5 awk text-processing

我有一个命令可以输出有关块中所有 DIMM 插槽的信息,如下所示:

ID    SIZE TYPE
44    105  SMB_TYPE_MEMDEVICE (type 17) (memory device)

  Manufacturer: NO DIMM
  Serial Number: NO DIMM
  Asset Tag: NO DIMM
  Location Tag: P1-DIMMD1
  Part Number: NO DIMM

  Physical Memory Array: 43
  Memory Error Data: Not Supported
  Total Width: 0 bits
  Data Width: 0 bits
  Size: Not Populated
  Form Factor: 9 (DIMM)
  Set: None
  Rank: Unknown
  Memory Type: 2 (unknown)
  Flags: 0x4
        SMB_MDF_UNKNOWN (unknown)
  Speed: Unknown
  Configured Speed: Unknown
  Device Locator: P1-DIMMD1
  Bank Locator: P0_Node1_Channel0_Dimm0
  Minimum Voltage: 1.20V
  Maximum Voltage: 1.20V
  Configured Voltage: 1.20V
Run Code Online (Sandbox Code Playgroud)

这些块以ID SIZE TYPE标题开始,以配置的电压信息结束。该命令为每个 DIMM 输出这些数据块之一,每个 DIMM 由一个空行分隔。


我希望能够根据Location Tag字段获取特定 DIMM 插槽的信息块,但我不确定如何去做。我很确定这可以完成,awk但只知道如何在匹配awk '/P1-DIMMD1/'之前打印匹配或行awk '/P1-DIMMD1/ {print a}{a=$0}'

有谁知道如果Location Tag与我的搜索 ( P1-DIMMD1)匹配,我如何提取整个数据块?

Ste*_*itt 6

以下将匹配标签变量中给出的标签:

awk -v tag=P1-DIMMD1 '/ID    SIZE TYPE/ { block = $0; output = 0; next } { block = block "\n" $0 } /Location Tag/ { output = ($0 ~ tag) } /Configured Voltage/ && output { print block }'
Run Code Online (Sandbox Code Playgroud)

AWK 脚本是

/ID    SIZE TYPE/ {
  block = $0
  output = 0
  next
}

{ block = block "\n" $0 }

/Location Tag/ { output = ($0 ~ tag) }

/Configured Voltage/ && output { print block }
Run Code Online (Sandbox Code Playgroud)

我们在block变量中累积一个块,如果我们在过程中看到正确的标签,则在到达块的末尾时输出它。