Регулярное выражение для формирования JSON из arp -a результата - PullRequest
0 голосов
/ 30 июня 2019

У меня есть arp -a результат примерно так:

Albacore (192.168.1.1) at a5:5d:a1:ec:e3:52 on en0 ifscope [ethernet]
Beaufort (192.168.1.109) at 3B:EA:D2:2D:7F:06 on en0 ifscope [ethernet]

и мне нужно сформировать из него JSON, который выглядит так:

[
 {
  "ip":"192.168.1.1",
  "mac":"a5:5d:a1:ec:e3:52",
  "hostname":"Albacore"
 },
 {
  "ip":"192.168.1.109",
  "mac":"3B:EA:D2:2D:7F:06",
  "hostname":"Beaufort"
 }
]

Я знаю,что это регулярное выражение может найти имя хоста

^\S*

, это можно использовать для поиска ips

((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)

и это для адресов MAC

([0-9a-f]{1,2}[\.:-]){5}([0-9a-f]{1,2})

Они, вероятно, нелучше всего, но они должны выполнить работу для моего сценария.

В любом случае, я не могу понять, как собрать все это вместе и сформировать JSON.

Спасибо за все ваши советы.

Ответы [ 2 ]

1 голос
/ 30 июня 2019

Считывание входных данных построчно через цикл while и read:

while read line || [[ -n $line ]]; do
    ...
done

Проверка гарантирует, что мы не действуем при неверном вводе.

Захват компонентов в переменные с помощью подстановки команд :

ip="$(echo "$line" | sed 's/<capture pattern>/\n/')"

Вывести строки текста с заменами в тех местах, где вы хотите, с помощью printf и раскрытия параметров :

printf "%s\n" "\"ip\":\"${ip}\","

Этого должно быть достаточно, чтобы собрать рабочий скрипт вместе. Кроме того, если выходные данные из arp надежно определены, вы можете избежать регулярных выражений и просто разбить строки на разделителе (здесь, пробел) и использовать индексы и расширение переменных для достижения того же.

Разделить строку на пустом месте в массив с помощью read:

read -ra arr <<< "$line"

Доступ к array элементам через:

${arr[index]}

Для захвата ip потребуется манипулирование строками для удаления скобок. Удалить их через:

ip=${arr[1]#(}
ip=${ip%)}

Соберите все вместе, и у вас будет что-то вроде этого:

#!/bin/bash

## we'll insert commas between items before inserting the next item
## rather than at the end so that we don't add a trailing comma.
## we'll need this flag to know if we're at the first insertion,
## where we won't insert a comma.

first=1
printf "%s\n" "["
while read line || [[ -n $line ]]; do
    if [ $first -eq 0 ]; then
        printf "%s\n" ","
    else
        first=0
    fi

    read -ra arr <<< "$line"

    ip=${arr[1]#(}
    ip=${ip%)}

    printf "%s\n" "  {"
    printf "%s\n" "    \"ip\":\"${ip}\","
    printf "%s\n" "    \"mac\":\"${arr[3]}\","
    printf "%s\n" "    \"hostname\":\"${arr[0]}\""
    printf "%s" "  }"
done
printf "\n%s\n" "]"

Я не знаком с arp, но если бы этот файл был назван, скажем, arp-to-json, то вы, вероятно, использовали бы его через:

arp -a | arp-to-json

Вы можете быстро проверить, что json хорошо отформатирован, используя jq:

arp -a | arp-to-json | jq --indent 4

Ожидаемый результат должен точно соответствовать указанному вами.

0 голосов
/ 30 июня 2019

Кажется, ваше регулярное выражение не работает с использованием регулярного выражения Python, поэтому я немного их изменил, вот пример использования Python:

import re
import json

lines = ["Albacore (192.168.1.1) at a5:5d:a1:ec:e3:52 on en0 ifscope [ethernet]",
"Beaufort (192.168.1.109) at 3B:EA:D2:2D:7F:06 on en0 ifscope [ethernet]"]

json_file = open('json.txt', 'w')
json_file.write("{\n")
for line in lines:
    dump = {}
    dump['hostname']  = re.findall(r'^(.*?)\s', line)[0]
    dump['mac'] = re.findall(ur'(?:[0-9a-fA-F]:?){12}', line)[0]
    dump['ip']  = re.findall(r'[0-9]+(?:\.[0-9]+){3}', line)[0]
    json.dump(dump, json_file)
    json_file.write(",\n")
json_file.write("}")
json_file.close()

вывод в json.txt:

{
{"ip": "192.168.1.1", "mac": "a5:5d:a1:ec:e3:52", "hostname": "Albacore"},
{"ip": "192.168.1.109", "mac": "3B:EA:D2:2D:7F:06", "hostname": "Beaufort"},
}

Вы также можете изменить отображение данных JSON, если хотите, подробнее об этом: https://appdividend.com/2019/04/15/how-to-convert-python-dictionary-to-json-tutorial-with-example/

...