Potrzebuję twojej pomocy / wskazówek przy wydobywaniu kilkusłowa przez wyrażenie regularne. Mam linię zapisaną w pliku (linia pokazana poniżej). Muszę wyodrębnić wartości dwóch słów (czas i interfejs) i zapisać je w zmiennej do dalszych obliczeń.
{"record-type":"int-stats","time":1389309548046925,"host-id":"a.b.c.d","interface":"ab-0/0/44","latency":111223}
Zatem wartości czasu i portu muszą być przechowywane w dwóch różnych zmiennych.
Odpowiedzi:
1 dla odpowiedzi № 1zakładając, że szukasz „czystych” skryptów powłoki, a nie perla, pytona lub programów, które na ogół nie są dołączone do systemu operacyjnego, oto coś, co możesz zrobić:
#!/bin/sh
JFILE=a.json
TIME=$(egrep -o ""time":[0-9]+" $JFILE | cut -d: -f2)
IFACE=$(egrep -o ""interface":"[a-z0-9/-]+"" $JFILE | cut -d: -f2 | sed -e "s/"//g")
echo "time = $TIME"
echo "interface = $IFACE"
0 dla odpowiedzi nr 2
Jeśli możesz użyć awk
to może być pomocne:
$ string="{"record-type":"int-stats","time":1389309548046925,"host-id":"a.b.c.d","interface":"ab-0/0/44","latency":111223}"
$ time=$(awk -F[:,] "{ print $4 }" <<< "$string")
$ interface=$(awk -F[:,] "{ gsub(/"/,"");print $8 }" <<< "$string")
$ echo "$time"
1389309548046925
$ echo "$interface"
ab-0/0/44
0 dla odpowiedzi № 3
możesz skorzystać z tablic. na przykład
#!/bin/sh
JFILE=a.json
TIME=(`egrep -o ""time":[0-9]+" $JFILE | cut -d: -f2 | tr "n" " "`)
IFACE=(`egrep -o ""interface":"[a-z0-9/-]+"" $JFILE | cut -d: -f2 | sed -e "s/"//g" | tr "n" " "`)
i=0
for each in ${TIME[@]}
do
echo "TIME[$i] = $each"
let i++
done
widzieć Tablice w powłoce unixowej? więcej o tablicach.