我有一个命令输出有关块中所有 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
这些块以ID SIZE TYPE
标题开始,以配置的电压信息结束。该命令为每个 DIMM 输出这些数据块之一,每个 DIMM 由一个空行分隔。
我希望能够根据该Location Tag
字段获取特定 DIMM 插槽的信息块,但我不确定如何去做。我很确定这可以完成,awk
但只知道如何打印匹配awk '/P1-DIMMD1/'
或匹配前的行awk '/P1-DIMMD1/ {print a}{a=$0}'
Location Tag
如果匹配我的搜索( ) ,有谁知道我如何提取整个数据块P1-DIMMD1
?
以下将匹配标签变量中给出的标签:
AWK 脚本是
我们在变量中累积一个块,
block
如果我们在过程中看到正确的标签,当我们到达块的末尾时输出它。你可以使用 ed ...和sed,伙计!
但是,您必须要为此使用 ed,因为 ed 想要对文件进行操作,而不是作为管道的一部分。
command > dimm-output
wanted=P1-DIMMD1
ed -s dimm-output <<< $'/Location Tag: '"$wanted"$'\n?^ID.*SIZE.*TYPE\n.,/Configured Voltage/p\nq\n' | sed 1,2d
ed
命令字符串分解为四个分隔的\n
命令:/
文本“Location Tag:”,后跟$wanted
变量的值?
模式:(行首)、“ID”、任何东西、“大小”、任何东西、“类型”.
) 到 (,
) 匹配“配置电压”的下一行,打印这些行 (p
)q
因为 ed 在您搜索时会自动打印匹配的行,所以我
sed
在这里删除了这两行。受@Stephen Kitts 很好的答案的启发,我编写了一个更通用的脚本来在具有指定的开始和结束模式时执行块匹配。
用法:
match_block START END MATCH [FILE]
或者
感谢您建议
awk
直接将其编写为脚本。我原来的shell脚本是:用法:
match_block START END MATCH [FILE]
。如果省略文件,
stdin
将使用。在你的情况下:
或者