我有一个 CSV 日志文件,如下所示:
{"locale":"en_US","action":null,"name_id":4820951,"time":80239874928,"focus":disabled,"end_data":false}
我只想提取后面name_id
的内容,因此输出将是 4820951。有没有办法用 sed 或 awk 做到这一点?
我是 unix 脚本的新手,因此将不胜感激。
这很简单grep -oP
:
grep -oP '"name_id" *: *\K\d+' file
4820951
还有一个非常简单的awk
解决方案。
awk -F: '/name_id/ {print $2}' RS=, file
4820951
如果你想要一个非常有趣的解决方案:
这似乎是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。
您可以尝试:
awk -F[,:] '{
for (i=1; i<=NF; i+=2) {
if ( $i ~ /name_id/ ) {
print $(i+1)
break
}
}
}' infile
它产生:
4820951