匹配字符串后提取数字

时间:2013-10-31 19:31:51

标签: bash unix sed awk

我有一个CSV日志文件,如下所示:

{"locale":"en_US","action":null,"name_id":4820951,"time":80239874928,"focus":disabled,"end_data":false}

我只想提取name_id之后的内容,以便输出为4820951.有没有办法用sed或awk做到这一点?

我是unix脚本的新手,所以非常感谢任何帮助。

4 个答案:

答案 0 :(得分:2)

使用grep -oP非常简单:

grep -oP '"name_id" *: *\K\d+' file
4820951

答案 1 :(得分:2)

还有一个非常简单的awk解决方案。

awk -F: '/name_id/ {print $2}' RS=, file
4820951

答案 2 :(得分:2)

如果你想要一个非常有趣的解决方案:

这似乎是。那么为什么不使用JavaScript解释器呢?如果你正在运行gnome-shell,你已经安装了gjs(如果没有,你可能也有一个JS解释器;或者没有)。使用gjs

gjs -c 'var disabled="disabled";print({"locale":"en_US","action":null,"name_id":4820951,"time":80239874928,"focus":disabled,"end_data":false}.name_id);'

我必须定义disabled才能使其有效。

整洁,嗯?

如果您的完整文件中包含类似的行:

while read -r l; do
    printf -v c 'var disabled="disabled"; print(%s.name_id);' "$l"
    gjs -c "$c"
done < file

它不是最有效的,但你会确保数据总是被很好地解析。 :)

您可以尝试使用rhino代替gjs,但rhino要慢得多。 YYMV。

答案 3 :(得分:1)

您可以尝试:

awk -F[,:] '{ 
    for (i=1; i<=NF; i+=2) { 
        if ( $i ~ /name_id/ ) { 
            print $(i+1)
            break
        } 
    } 
}' infile

它产生:

4820951