1

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

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

我只想提取后面name_id的内容,因此输出将是 4820951。有没有办法用 sed 或 awk 做到这一点?

我是 unix 脚本的新手,因此将不胜感激。

4

4 回答 4

2

这很简单grep -oP

grep -oP '"name_id" *: *\K\d+' file
4820951
于 2013-10-31T19:47:17.313 回答
2

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

awk -F: '/name_id/ {print $2}' RS=, file
4820951
于 2013-10-31T20:41:26.110 回答
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。

于 2013-10-31T21:34:28.003 回答
1

您可以尝试:

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

它产生:

4820951
于 2013-10-31T19:44:41.697 回答