2013-03-12 105 views
10

我有一個文件,需要使用shell腳本通過鍵查找值。該文件看起來像:從shell腳本解析文件中的鍵/值的代碼

HereIsAKey This is the value 

我怎麼可以這樣做:

MyVar=Get HereIsAKey 

然後MyVar的應該等於「這就是價值。」密鑰沒有空格,值應該是密鑰後面的空格。

回答

15

如果HereIsAKey在文件中是獨一無二的,試試這個使用grep:

myVar=$(grep -Po "(?<=^HereIsAKey).*" file) 
+0

太棒了!一個我不熟悉腳本的問題。我想要一個像GetConfigValue這樣的函數,它將把HereIsAKey作爲參數。我怎樣才能把傳入的參數放入正則表達式中? – 2013-03-12 16:49:47

+0

這很好:echo「(grep -Po \」(?<= ^「」$ 1「」)。* \「file)」,但我很難將其分配給一個變量。我得到MyParam:命令未找到。 – 2013-03-12 17:34:24

+0

沒關係。知道了:REGEXP =「grep -Po \」(?<=^$ {1})。* \「file」 – 2013-03-12 18:01:21

4

如果文件不排序,查找將是緩慢的:

my_var=$(awk '/^HereIsAKey/ { $1=""; print $0; exit}' value-file) 

如果文件進行排序,你可以得到

my_var=$(look HereIsAkey value-file | cut -d ' ' -f 2-) 
+0

它工作正常在CentOS 5! – 2014-04-11 21:34:50

+0

「外觀工具出現在AT&T Unix版本7中。」 – hagello 2016-06-29 13:26:02

5

更快的查找如果你只需要一個變量在時間,你可以這樣做:

#!/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" 
+0

作業的左側不能是參數擴展 – chepner 2013-03-12 17:08:33

+0

找到了作業的解決方案 – 2013-03-13 12:25:25

+1

這是一個非常不必要的詳細修復。只需要使用現有的'while read'循環,在開始處將' 2017-03-13 14:42:12

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 reads從config.properties文件爲文件中的每一行填充一組變量__property_...,然後get_prop允許基於加載的屬性設置變量。它適用於大多數需要的情況。

是的,我意識到有一個eval在那裏,這使得它不安全的用戶輸入,但它適用於我需要它做。

0
get() { 
    while read -r key value; do 
     if [ "$key" = "$1" ]; then 
      echo "$value" 
      return 0 
     fi 
    done 
    return 1 
} 

這兩個返回語句不是絕對必要的,但提供了很好的退出代碼來指示找到給定鍵時的成功或失敗。它們還可以幫助區分「密鑰具有空值字符串」和「未找到密鑰」。

4

如果您還沒有支持Perl兼容的正則表達式的grep,下面似乎工作:

VAR=$(grep "^$KEY " file | cut -d' ' -f2-) 
+0

這不僅是更具可讀性和便攜性,它可以如果你在等於:'grep「^ $ KEY」$ FILE |「上切換,也會處理可變的空白大小cut -d'='-f2-' – 7yl4r 2017-10-04 17:17:57