我有一个文件,我需要使用shell脚本按键查找值。该文件看起来像:
HereIsAKey This is the value
我该怎么做:
MyVar=Get HereIsAKey
然后MyVar应该等于“这是值”。密钥没有空格,值应该是密钥后面的空格。
答案 0 :(得分:21)
如果HereIsAKey
在您的文件中是唯一的,请尝试使用grep:
myVar=$(grep -Po "(?<=^HereIsAKey ).*" file)
答案 1 :(得分:8)
如果你没有支持与Perl兼容的正则表达式的grep,以下似乎可行:
VAR=$(grep "^$KEY " file | cut -d' ' -f2-)
答案 2 :(得分:6)
如果您一次只需要一个变量,则可以执行以下操作:
#!/bin/bash
cat file | while read key value; do
echo $key
echo $value
done
此解决方案的问题:变量仅在循环内有效。因此,不要尝试$key=$value
并在循环后使用它。
更新:另一种方式是I / O重定向:
exec 3<file
while read -u3 key value; do
eval "$key='$value'"
done
exec 3<&-
echo "$keyInFile1"
echo "$anotherKey"
答案 3 :(得分:4)
如果文件未排序,查找将会很慢:
my_var=$( awk '/^HereIsAKey/ { $1=""; print $0; exit}' value-file )
如果文件已排序,您可以使用
更快地查找my_var=$( look HereIsAkey value-file | cut -d ' ' -f 2- )
答案 4 :(得分:0)
我使用多种语言共享的属性文件,我使用了一对函数:
load_properties() {
local aline= var= value=
for file in config.properties; do
[ -f $file ] || continue
while read aline; do
aline=${aline//\#*/}
[[ -z $aline ]] && continue
read var value <<<$aline
[[ -z $var ]] && continue
eval __property_$var=\"$value\"
# You can remove the next line if you don't need them exported to subshells
export __property_$var
done <$file
done
}
get_prop() {
local var=$1 key=$2
eval $var=\"\$__property_$key\"
}
load_properties
从config.properties
文件中读取,为文件中的每一行填充一组变量__property_...
,然后get_prop允许根据加载的属性设置变量。它适用于大多数需要的情况。
是的,我确实意识到那里有一个评估,这使得对用户输入不安全,但它适用于我需要它做的事情。
答案 5 :(得分:0)
get () {
while read -r key value; do
if [ "$key" = "$1" ]; then
echo "$value"
return 0
fi
done
return 1
}
这两个return语句并不是绝对必要的,但提供了很好的退出代码来指示找到给定键的成功或失败。它们还可以帮助区分“键值为空字符串”和“未找到键”。