存储和查询文件中的映射,而无需重新发明轮子

时间:2011-02-22 07:26:24

标签: shell mapping

如果我使用的是Python,我会使用dict。如果我使用Perl,我会使用哈希。但我正在使用Unix shell。如何使用shell工具?

在文本文件中实现持久性映射表

我需要根据字符串键查找映射条目,并查询该键的几个字段之一。

Unix已经有像系统passwd表这样的映射的冒号分隔记录,但似乎没有一个工具可以读取以这种方式格式化的任意文件。所以人们求助于:

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

但这很啰嗦。当然,我不需要做一个功能吗? 这个轮子是不是已经在标准工具中发明和实现了?

5 个答案:

答案 0 :(得分:1)

鉴于条件,我没有看到任何毛茸茸的方法。但也许可以考虑使用awk来提取数据。 awk方法只允许选择第一个或最后一个条目,或强加任意附加条件:

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

一旦捆绑在一个函数中,它就不那么可怕了:)

我担心至少在POSIX中没有更好的方法。但您也可以查看join命令。

答案 1 :(得分:0)

Bash支持的数组不完全相同。请参阅示例this guide

area[11]=23
area[13]=37
area[51]=UFOs
echo ${area[11]}

答案 2 :(得分:0)

请参阅this LinuxJournal article了解Bash> = 4.0。对于其他版本的Bash,你可以伪造它:

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

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

# then
hput a blah
hget a   # yields blah

答案 3 :(得分:0)

您的示例是使用shell工具执行此操作的几种方法之一。请注意,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特别擅长处理纯文本字段和记录。

答案 4 :(得分:0)

在这种情况下的答案似乎是:不,对于一般情况,没有广泛可用的'passwd'文件格式的实现,并且在每种情况下都需要轮再发明。