通过 awk 抓取没有固定位置的字段

通过 awk 抓取没有固定位置的字段

我正在编写一个脚本来唤醒 LAN 上的不同 LC。MAC 地址很难记住,所以我自己制作了一个列表,其中包含有关各个 PC 的信息。现在列表如下所示:

dragoner xxx.xxx.xxx.xxx xx:xx:xx:xx:xx:xx
theseus yyy.yyy.yyy.yyy yy:yy:yy:yy:yy:yy
...

这意味着,新条目将始终采用以下形式:netbios-name ipv4 mac。优点是,这样的列表可以通过grep和轻松查询awk

我更希望有这样一个列表:

netbios=dragoner ip4=xxx.xxx.xxx.xxx mac=xx:xx:xx:xx:xx:xx
netbios=theseus mac=yy:yy:yy:yy:yy:yy ip4=yyy.yyy.yyy.yyy
...

通过这种方式,可以更轻松地添加新信息,并且行不必具有一定数量的列......但我无法通过 awk 查询它。

答案1

无论哪种列表格式,你都应该能够搜索它。我不确定你想做什么过去简单的查找,但由于它们的相对格式,MAC 地址总是包含:,IP.和 netbios 应该清除两者。

什么不行grep '1.2.3.4' mylist

你可以对此非常严厉,并做类似的事情:

source <(grep '1.2.3.4' mylist)
echo "$netbios $ip"

答案2

awk '{
    delete fields
    for (i=1; i<=NF; i++) {
        split($i, f, /=/)
        fields[f[1]] = f[2]
    }
    # do something with fields["ipv4"], fields["mac"], fields["netbios"]
}' filename

或者,不要使用 awk,而使用 bash

while IFS= read -r line; do
    eval "declare $line"
    # do something with $ipv4, $mac, $netbios
done < filename

相关内容