найти Сетевую карту Производитель из macaddress.io MA C json база данных - PullRequest
1 голос
/ 10 января 2020

Существует ли эффективный способ запроса базы данных macaddress.io json Ma c с использованием jq для поиска производителя сетевого автомобиля. база данных находится в свободном доступе по адресу https://macaddress.io/database-download (выберите json + загрузить

  "oui": "00:50:C2:73:E",
  "isPrivate": false,
  "companyName": "Quantec Networks GmbH",
  "companyAddress": "Rieselwiese 1 Vienenburg Niedersachsen 38690 DE",
  "countryCode": "DE",
  "assignmentBlockSize": "IAB",
  "dateCreated": "2007-05-14",
  "dateUpdated": "2015-08-29"
}

Для компьютера DeLL я могу сделать запрос следующим образом: cat macaddress.io-db.json |jq 'select(.oui|test("14:18:77"))' К сожалению, для вышеупомянутого запись, существует несколько названий компаний, соответствующих 00: 50: C2, и вам нужно дать больше di git, чтобы получить уникальный правильный ответ.

Гадкий подход - l oop на полной MA C адрес удаляет один ди git до тех пор, пока запрос не будет выполнен.

Так что для компьютера DeLL это будет l oop 6 раз, прежде чем мы получим результат: Давайте возьмем 14: 18: 77: 34: 23:12 MA C как пример:

1st query: 14:18:77:34:23:1 => no answer
2nd query: 14:18:77:34:23 => no answer
3rd query: 14:18:77:34:2 => no answer
4th query: 14:18:77:34 => no answer
5th query: 14:18:77:3 => no answer
6th query: 14:18:77 => we get the DeLL record:
{
  "oui": "14:18:77",
  "isPrivate": false,
  "companyName": "Dell Inc",
  "companyAddress": "One Dell way Round Rock 78682 US",
  "countryCode": "US",
  "assignmentBlockSize": "MA-L",
  "dateCreated": "2015-06-13",
  "dateUpdated": "2019-07-01"
}

Интересно, существует ли более разумный подход, который бы возвращал лучшее совпадение при полной MA C.

Например: 14: 18: 77: 34: 23: 12 MA C будет соответствовать записи 14:18:77 (DeLL)

И 00: 50: C2: 73: E3: 27 MA C будет соответствует 00: 50: C2: 73: E запись, а не 00: 50: C2: 73: F запись.

Любая идея / tips / jq команда для достижения sh вышеуказанного «мягкого / умного» соответствия ?

(Цель, учитывая полный М A C (в верхнем или нижнем регистре), чтобы получить поле companyName или «Неизвестно» (или «»), если не найдено.)

Обратите внимание, что поля oui уникальны и подмножество отсутствует (если XX: YY: ZZ: TT существует, у вас не может быть XX: YY: ZZ (но у вас может быть XX: YY: ZZ: UU)). Знание этого означает, что самое длинное совпадение является уникальным (одна запись).

1 Ответ

1 голос
/ 11 января 2020

Ключ к разумно эффективному решению - начать с сбора вероятных кандидатов, используя inputs с параметром командной строки -n jq. Имея это в виду, мы можем написать:

# Winnow recursively
def winnow($s; $i):
  if ($s|length) < $i then . # no further winnowing
  else $s[0:$i] as $ss
  | map(select(.oui | startswith($ss))) as $result
  | if ($result|length) == 0 then . # prior
    elif ($result|length) == 1 then $result
    else $result | winnow($s; $i+1)
    end
  end;

def bestMatch($s):
  $s[0:1] as $first
  | [inputs | select(.oui | startswith($first))]
  | (select(length>0) | winnow($s; 2)) // "Unknown"
  | if type == "array" and length == 1 then .[0] else . end
  ;

Примеры

bestMatch("14:18:77:34:23:12")

дает объект JSON с .oui == "14:18:77";

bestMatch("00:50:C2:73:E3:27") 

возвращает объект JSON с .oui == "00: 50: C2: 73: E"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...