如果我使用的是Python,我会使用dict。如果我使用Perl,我会使用哈希。但我正在使用Unix shell。如何使用shell工具?
在文本文件中实现持久性映射表我需要根据字符串键查找映射条目,并查询该键的几个字段之一。
Unix已经有像系统passwd
表这样的映射的冒号分隔记录,但似乎没有一个工具可以读取以这种方式格式化的任意文件。所以人们求助于:
key=foo
fieldnum=3
value=$(cat /path/to/mapping | grep "^$key:" | cut -d':' -f$fieldnum)
但这很啰嗦。当然,我不需要做一个功能吗? 这个轮子是不是已经在标准工具中发明和实现了?
答案 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'文件格式的实现,并且在每种情况下都需要轮再发明。