Вернуть вывод команды в ассоциативный массив

Системы, использующие systemd , обычно настроены на выгрузку ядер в

/var/lib/systemd/coredump/

. Вы можете использовать команду coredumpctl для вывода списка дампов ядер. { {1}} См. Также no-more-coredumps-after-migrating-to-systemd

6
01.04.2017, 17:13
4 ответа
declare -A mx
eval $(dig mx +short google.com | sed "s/'//g; s/^/mx[/; s/ /]='/; s/$/';/")

Сначала объявите ассоциативный массив с именем mx , затем выполните dig и используйте sed для преобразования вывода в назначения ассоциативного массива, затем eval , что в текущую оболочку. Команда sed удаляет все одинарные кавычки, а затем оборачивает присвоение переменной, используя одинарные кавычки для заключения значения.

2
27.01.2020, 20:25

Вы можете использовать внутренний разделитель полей для разделения ввода на строки

 IFS="\n" read -ra ADDR <<< "$IN"
0
27.01.2020, 20:25

Прежде всего, я думаю, что решение Стивена Рауха (наряду с комментарием Чепнера) замечательное. Но когда дело доходит до ассоциативных массивов, я почти всегда использую словари в Python, не потому что мне не нравится Bash, а потому что с ними (на мой взгляд) проще работать на языке более высокого уровня.

Ниже приведен пример использования в Python.

#!/usr/bin/env python3

import subprocess
import os
import json

digDict = {}
tmpOut = open("tmpOut", "w")
output = subprocess.call(['dig', 'mx', '+short', 'google.com'], stdout=tmpOut)

# Fill the dictionary with the values we want
with open("tmpOut") as infile:
    for line in infile:
        digDict[line.split()[0]] = line.split()[1]

os.remove("tmpOut")

# Sort the dictionary by key
print("Sorted dictionary:")
for key in sorted(digDict):
    print(key + " -> " + digDict[key])

# Get a specific value based on key
print("Access value associated with key '10' (digDict[\"10\"]):")
print(digDict["10"])

# "Pretty print" the dictionary in json format
print("json format:")
print(json.dumps(digDict, sort_keys=True, indent=4))

# Saved the dictionary to file in json format
with open("digDict.json", "w") as fp:
    json.dump(digDict, fp, sort_keys=True, indent=4)

exit(0)

Выполнение:

./myDig.py 
Sorted dictionary:
10 -> aspmx.l.google.com.
20 -> alt1.aspmx.l.google.com.
30 -> alt2.aspmx.l.google.com.
40 -> alt3.aspmx.l.google.com.
50 -> alt4.aspmx.l.google.com.
Access value associated with key '10' (digDict["10"]):
aspmx.l.google.com.
json format:
{
    "10": "aspmx.l.google.com.",
    "20": "alt1.aspmx.l.google.com.",
    "30": "alt2.aspmx.l.google.com.",
    "40": "alt3.aspmx.l.google.com.",
    "50": "alt4.aspmx.l.google.com."
}

cat digDict.json:

{
    "10": "aspmx.l.google.com.",
    "20": "alt1.aspmx.l.google.com.",
    "30": "alt2.aspmx.l.google.com.",
    "40": "alt3.aspmx.l.google.com.",
    "50": "alt4.aspmx.l.google.com."
}

Опять же, решение выше в Bash - отличное (и проголосованное мной). Это просто еще один пример на Python, не более того.

1
27.01.2020, 20:25

Вот один из способов чтения этих данных в ассоциативный массив bash:

Код:

#!/usr/bin/env bash
declare -A hosts
while IFS=" " read -r priority host ; do
  hosts["$priority"]="$host"
done < <(dig mx +short google.com)    

for priority in "${!hosts[@]}" ; do
  echo "$priority -> ${hosts[$priority]}"
done

Вывод:

20 -> alt1.aspmx.l.google.com.
10 -> aspmx.l.google.com.
50 -> alt4.aspmx.l.google.com.
40 -> alt3.aspmx.l.google.com.
30 -> alt2.aspmx.l.google.com.
9
27.01.2020, 20:25

Теги

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