我有一个CSV日志文件,如下所示:
{"locale":"en_US","action":null,"name_id":4820951,"time":80239874928,"focus":disabled,"end_data":false}
我只想提取name_id
之后的内容,以便输出为4820951.有没有办法用sed或awk做到这一点?
我是unix脚本的新手,所以非常感谢任何帮助。
答案 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)
如果你想要一个非常有趣的解决方案:
这似乎是json。那么为什么不使用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