Захватить поле без фиксированной позиции через awk

Я работаю над сценарием для пробуждения разных LC в моей локальной сети. MAC-адреса трудно запомнить, поэтому я составил список, содержащий информацию о соответствующих компьютерах. Прямо сейчас список выглядит так:

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.

2
задан 28 March 2014 в 17:08

2 ответа

В любом формате списка необходимо быть в состоянии просто искать его. Я не уверен, что Вы пробуете к , делают поиски простого прошедшего, но благодаря их относительным форматам, MAC-адреса всегда собираются содержать :, дюйм/с . и netbios должен быть чистым из обоих.

, Что не делает grep '1.2.3.4' mylist, делают?

И Вы могли быть действительно bashy об этом и сделать что-то как:

source <(grep '1.2.3.4' mylist)
echo "$netbios $ip"
0
ответ дан 28 March 2014 в 17:08
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, используйте удар

while IFS= read -r line; do
    eval "declare $line"
    # do something with $ipv4, $mac, $netbios
done < filename
2
ответ дан 28 March 2014 в 17:08

Другие вопросы по тегам:

Похожие вопросы: