Pegue um campo sem uma posição fixa via awk

2

Estou trabalhando em um script para ativar diferentes LCs na minha LAN. MAC-Adresses são difíceis de memorizar, então eu fiz uma lista que contém informações sobre os respectivos PCs. No momento, a lista parece:

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

Isso significa que as novas entradas sempre terão que estar no formato: netbios-name ipv4 mac . A vantagem é que essa lista pode ser facilmente consultada por grep e awk .

Eu gostaria de ter uma lista assim:

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
...

Dessa forma, novas informações poderiam ser adicionadas mais facilmente e a linha não precisaria ter um determinado número de colunas ... mas não estou conseguindo consultá-las via awk.

    
por Markus 28.03.2014 / 13:57

2 respostas

3

Em qualquer formato de lista, você deve ser capaz de pesquisá-lo. Não sei ao certo o que você está tentando fazer fazer pesquisas simples, mas graças aos seus formatos relativos, os endereços MAC sempre contêm : , IPs . e netbios devem estar limpos ambos.

O que não é grep '1.2.3.4' mylist ?

E você poderia ser realmente bashy sobre isso e fazer algo como:

source <(grep '1.2.3.4' mylist)
echo "$netbios $ip"
    
por Oli 28.03.2014 / 14:13
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

Ou não use awk, use bash

while IFS= read -r line; do
    eval "declare $line"
    # do something with $ipv4, $mac, $netbios
done < filename
    
por glenn jackman 28.03.2014 / 14:10