2013-03-12 8 views
10

Mam plik, który muszę wyszukać wartość za pomocą klucza, używając skryptu powłoki. Plik wygląda następująco:Kod parsowania klucza/wartości w pliku ze skryptu powłoki

HereIsAKey This is the value 

Jak można zrobić coś takiego:

MyVar=Get HereIsAKey 

a następnie MyVar powinien być równy „To jest wartość”. Klucz nie ma białych znaków, a wartość powinna być wszystkim po spacji po klawiszu.

Odpowiedz

15

jeśli HereIsAKey jest unikalna w pliku, spróbuj tego z grep:

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

Świetnie! Jedno pytanie, ponieważ jestem nowy w skryptach. Chcę funkcji takich jak: GetConfigValue i zajęłoby HereIsAKey jako parametr. Jak umieścić przekazany parametr w wyrażeniu regularnym? –

+0

To jest w porządku: echo "(grep -Po \" (? <=^"" $ 1 ""). * \ "Plik)", ale mam problem z przypisaniem go do zmiennej. Otrzymuję MyParam: polecenie nie znaleziono. –

+0

Nieważne. Rozumiem: REGEXP = "grep -Po \" (? <=^$ {1}). * \ "Plik" –

4

Jeśli plik jest nieposortowane, wyszukiwań będzie powolny:

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

Jeśli plik jest posortowana, można uzyskać szybsze wyszukiwanie z

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

działa poprawnie na CentOS 5! –

+0

"Narzędzie look pojawiło się w wersji 7 AT & T Unix." – hagello

5

Jeśli potrzebne jest tylko jedno zmiennej w czas, można zrobić coś takiego:

#!/bin/bash 
cat file | while read key value; do 
    echo $key 
    echo $value 
done 

problem z tym rozwiązaniem: zmienne są ważne tylko ja Wewnątrz pętli. Więc nie próbuj robić $key=$value i używać go po pętli.

Aktualizacja: Innym sposobem jest I/O przekierowania:

exec 3<file 
while read -u3 key value; do 
    eval "$key='$value'" 
done 
exec 3<&- 
echo "$keyInFile1" 
echo "$anotherKey" 
+0

Lewa strona przypisania nie może być rozszerzeniem parametru – chepner

+0

znalazła rozwiązanie dla zadania –

+1

To naprawdę niepotrzebnie pełna poprawka. Po prostu weź istniejącą pętlę 'while while', wstaw' 'plik' na końcu zamiast' cat file' na początku, i gotowe. Zobacz także [BashFAQ # 24] (http://mywiki.wooledge.org/BashFAQ/024). –

0

używam pliku właściwość, która jest współdzielona przez wiele języków, używam pary funkcji:

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 czyta z pliku config.properties zapełnianie zestawu zmiennych __property_... dla każdej linii w pliku, get_prop następnie pozwala na ustawienie zmiennej na podstawie załadowanych właściwości. Działa w większości przypadków, które są potrzebne.

Tak, zdaję sobie sprawę, że jest tam eval, co czyni go niebezpiecznym dla użytkownika input, ale działa na to, co potrzebowałem.

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

Dwie zwrotne instrukcje nie są bezwzględnie konieczne, ale zapewniają ładne kody wyjścia, które wskazują na sukces lub niepowodzenie w znalezieniu danego klucza. Mogą również pomóc odróżnić "klucz ma pusty ciąg dla wartości" i "klucz nie został znaleziony".

4

Jeśli nie masz grep Perl, który obsługuje kompatybilne wyrażeń regularnych, co następuje wydaje się działać:

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

Nie tylko jest to bardziej czytelne i przenośne, ale może obsługuj również zmienny rozmiar spacji, jeśli wyciąć równe: 'grep"^$ KEY "$ FILE | cut-d '=' -f2-' – 7yl4r

Powiązane problemy