/ / Grep regexp (linux) do wyodrębnienia dwóch słów i przechowywania ich w zmiennych [duplikat] - regex, shell, grep

Grep regexp (linux) do wyodrębniania dwóch słów i przechowywania ich w zmiennych [duplicate] - regex, shell, grep

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 № 1

zakł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.