如果语句匹配,awk将变量设置为行

use*_*716 5 awk

我有以下文字......

BIOS Information
Manufacturer               : Dell Inc.
Version                    : 2.5.2
Release Date               : 01/28/2015

Firmware Information
Name                       : iDRAC7
Version                    : 2.21.21 (Build 12)

Firmware Information
Name                       : Lifecycle Controller 2
Version                    : 2.21.21.21
Run Code Online (Sandbox Code Playgroud)

...通过管道输入以下awk声明......

awk '{ if ($1" "$2 == "BIOS Information") var=$1} END { print var }'
Run Code Online (Sandbox Code Playgroud)

在这种情况下,这将输出'BIOS'.我想查找'BIOS Information',然后设置第三个字段,两行,所以在这种情况下'var'将等于'2.5.2'.有没有办法用awk做到这一点?

编辑:我尝试了以下内容:

awk ' BEGIN {
FS="[ \t]*:[ \t]*";
}
NF==1 {
  sectname=$0;
}
NF==2 && $1 == "Version" && sectname="BIOS Information" {
  bios_version=$2;
}
END {
  print bios_version;
}'
Run Code Online (Sandbox Code Playgroud)

这给了我'2.21.21.21'上面的文字.这可以修改为给我"BIOS信息"之后的第一个"版本"吗?

gud*_*dok 4

以下脚本可能有点过头了,但如果您有多个部分名称和/或字段顺序发生更改,那么它很强大。

BEGIN {
  FS="[ \t]*:[ \t]*";
}
NF==1 {
  sectname=$0;
}  
NF==2 && $1 == "Version" && sectname=="BIOS Information" {
  bios_version=$2;
} 
END {
  print bios_version;
}
Run Code Online (Sandbox Code Playgroud)

首先,我们设置输入字段分隔符,以便单词不会被分隔到不同的字段中。接下来,我们检查当前行是否是节名称或键值对。如果是节名,则设置sectname为节名。如果它是一个键值对,并且当前部分名称是“BIOS Information”,键是“Version”,那么我们设置bios_version.