我有一個文件,需要使用shell腳本通過鍵查找值。該文件看起來像:從shell腳本解析文件中的鍵/值的代碼
HereIsAKey This is the value
我怎麼可以這樣做:
MyVar=Get HereIsAKey
然後MyVar的應該等於「這就是價值。」密鑰沒有空格,值應該是密鑰後面的空格。
我有一個文件,需要使用shell腳本通過鍵查找值。該文件看起來像:從shell腳本解析文件中的鍵/值的代碼
HereIsAKey This is the value
我怎麼可以這樣做:
MyVar=Get HereIsAKey
然後MyVar的應該等於「這就是價值。」密鑰沒有空格,值應該是密鑰後面的空格。
如果HereIsAKey
在文件中是獨一無二的,試試這個使用grep:
myVar=$(grep -Po "(?<=^HereIsAKey).*" file)
如果文件不排序,查找將是緩慢的:
my_var=$(awk '/^HereIsAKey/ { $1=""; print $0; exit}' value-file)
如果文件進行排序,你可以得到
my_var=$(look HereIsAkey value-file | cut -d ' ' -f 2-)
它工作正常在CentOS 5! – 2014-04-11 21:34:50
「外觀工具出現在AT&T Unix版本7中。」 – hagello 2016-06-29 13:26:02
更快的查找如果你只需要一個變量在時間,你可以這樣做:
#!/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"
作業的左側不能是參數擴展 – chepner 2013-03-12 17:08:33
找到了作業的解決方案 – 2013-03-13 12:25:25
這是一個非常不必要的詳細修復。只需要使用現有的'while read'循環,在開始處將'
我使用跨共享的屬性文件多種語言,我使用一對功能:
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
reads從config.properties
文件爲文件中的每一行填充一組變量__property_...
,然後get_prop允許基於加載的屬性設置變量。它適用於大多數需要的情況。
是的,我意識到有一個eval在那裏,這使得它不安全的用戶輸入,但它適用於我需要它做。
get() {
while read -r key value; do
if [ "$key" = "$1" ]; then
echo "$value"
return 0
fi
done
return 1
}
這兩個返回語句不是絕對必要的,但提供了很好的退出代碼來指示找到給定鍵時的成功或失敗。它們還可以幫助區分「密鑰具有空值字符串」和「未找到密鑰」。
如果您還沒有支持Perl兼容的正則表達式的grep,下面似乎工作:
VAR=$(grep "^$KEY " file | cut -d' ' -f2-)
這不僅是更具可讀性和便攜性,它可以如果你在等於:'grep「^ $ KEY」$ FILE |「上切換,也會處理可變的空白大小cut -d'='-f2-' – 7yl4r 2017-10-04 17:17:57
太棒了!一個我不熟悉腳本的問題。我想要一個像GetConfigValue這樣的函數,它將把HereIsAKey作爲參數。我怎樣才能把傳入的參數放入正則表達式中? – 2013-03-12 16:49:47
這很好:echo「(grep -Po \」(?<= ^「」$ 1「」)。* \「file)」,但我很難將其分配給一個變量。我得到MyParam:命令未找到。 – 2013-03-12 17:34:24
沒關係。知道了:REGEXP =「grep -Po \」(?<=^$ {1})。* \「file」 – 2013-03-12 18:01:21