Сохраните и запросите отображение в файле, не изобретая колесо - PullRequest
0 голосов
/ 22 февраля 2011

Если бы я использовал Python, я бы использовал dict.Если бы я использовал Perl, я бы использовал хеш.Но я использую оболочку Unix.Как реализовать таблицу постоянных сопоставлений в текстовом файле, используя инструменты оболочки ?

Мне нужно просмотреть записи сопоставления на основе строкового ключа и запросить одно из нескольких полей для этого.key.

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

key=foo
fieldnum=3
value=$(cat /path/to/mapping | grep "^$key:" | cut -d':' -f$fieldnum)

, но это довольно скучно.Конечно, мне не нужно создавать функцию для этого? Разве это колесо не было изобретено и реализовано в стандартном инструменте?

Ответы [ 5 ]

1 голос
/ 22 февраля 2011

Учитывая условия, я не вижу ничего странного в подходе.Но, возможно, рассмотрим awk для извлечения данных.Подход awk позволяет выбрать только первую или последнюю запись или наложить любые произвольные дополнительные условия:

value=$(awk -F: "/^$key:/{print \$$fieldnum}" /path/to_mapping)

После объединения в функцию это не так страшно:)

IБоюсь, что нет лучшего способа, по крайней мере, в POSIX.Но вы также можете взглянуть на команду join.

0 голосов
/ 13 апреля 2011

Ответ в этом случае выглядит следующим образом: нет, широко распространенная реализация формата файла 'passwd' для общего случая отсутствует, и в каждом случае необходимо переосмысление колеса.

0 голосов
/ 22 февраля 2011

Ваш пример - один из нескольких способов сделать это, используя инструменты оболочки.Обратите внимание, что cat не требуется.

key=foo
fieldnum=3
filename=/path/to/mapping
value=$(grep "^$key:" "$filename" | cut -d':' -f$fieldnum)

Иногда join также пригодится.

AWK, Python, Perl, sed и различные инструменты XML, JSON и YAMLкроме того, конечно, можно использовать базы данных, такие как MySQL и SQLite.

Без их использования все остальное иногда может быть запутанным.К сожалению, нет никакой «стандартной» утилиты.Я бы сказал, что ответ от Пуха подходит ближе всего.AWK особенно искусен в работе с полями и записями в текстовом формате.

0 голосов
/ 22 февраля 2011

См. эту статью LinuxJournal для Bash> = 4.0. Для других версий Bash вы можете подделать его:

hput () {
  eval hash"$1"='$2'
}

hget () {
  eval echo '${hash'"$1"'#hash}'
}

# then
hput a blah
hget a   # yields blah
0 голосов
/ 22 февраля 2011

Bash поддерживает массивы, что не совсем то же самое. См. Например это руководство .

area[11]=23
area[13]=37
area[51]=UFOs
echo ${area[11]}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...