Grep regex(linux)用于提取两个单词并将它们存储在变量中

时间:2014-02-19 03:07:31

标签: regex shell grep

我需要你的帮助/指针,通过正则表达式提取几个单词。我有一行存储在文件中(如下所示)。我需要提取两个单词的值(时间和接口)并将它们存储在变量中以便进一步计算。

{"record-type":"int-stats","time":1389309548046925,"host-id":"a.b.c.d","interface":"ab-0/0/44","latency":111223} 

因此,时间和端口的值需要存储在两个不同的变量中。

3 个答案:

答案 0 :(得分:1)

假设您正在寻找“纯”shell脚本而不是perl或python或程序通常不与操作系统捆绑在一起,您可以执行以下操作:

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

答案 1 :(得分:0)

如果您可以使用awk,那么可能会有所帮助:

$ 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

答案 2 :(得分:0)

你可以使用数组。 e.g。

#!/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

有关数组的更多信息,请参阅Arrays in unix shell?