Bash 匹配字符串后提取数字
我有一个CSV日志文件,看起来像:Bash 匹配字符串后提取数字,bash,unix,sed,awk,json,Bash,Unix,Sed,Awk,Json,我有一个CSV日志文件,看起来像: {"locale":"en_US","action":null,"name_id":4820951,"time":80239874928,"focus":disabled,"end_data":false} 我只想提取name\u id之后的内容,因此输出为4820951。有没有一种方法可以通过sed或awk实现这一点 我是unix脚本新手,因此非常感谢您的帮助。您可以尝试使用: awk -F[,:] '{ for (i=1; i<=NF;
{"locale":"en_US","action":null,"name_id":4820951,"time":80239874928,"focus":disabled,"end_data":false}
我只想提取name\u id
之后的内容,因此输出为4820951。有没有一种方法可以通过sed或awk实现这一点
我是unix脚本新手,因此非常感谢您的帮助。您可以尝试使用:
awk -F[,:] '{
for (i=1; i<=NF; i+=2) {
if ( $i ~ /name_id/ ) {
print $(i+1)
break
}
}
}' infile
您可以尝试以下方法:
awk -F[,:] '{
for (i=1; i<=NF; i+=2) {
if ( $i ~ /name_id/ ) {
print $(i+1)
break
}
}
}' infile
使用
grep-oP
非常简单:
grep -oP '"name_id" *: *\K\d+' file
4820951
使用
grep-oP
非常简单:
grep -oP '"name_id" *: *\K\d+' file
4820951
还有一个非常简单的
awk
解决方案
awk -F: '/name_id/ {print $2}' RS=, file
4820951
还有一个非常简单的
awk
解决方案
awk -F: '/name_id/ {print $2}' RS=, file
4820951
如果您想要一个非常有趣的解决方案: 这似乎是。那么为什么不使用JavaScript解释器呢?如果您运行的是gnome shell,那么您已经安装了
gjs
(如果没有,您可能也有JS解释器;或者没有)。使用gjsgjs
:
gjs -c 'var disabled="disabled";print({"locale":"en_US","action":null,"name_id":4820951,"time":80239874928,"focus":disabled,"end_data":false}.name_id);'
我必须定义禁用
,这样它才能工作
整洁,嗯
如果您有一个包含类似行的完整文件:
while read -r l; do
printf -v c 'var disabled="disabled"; print(%s.name_id);' "$l"
gjs -c "$c"
done < file
读取时-rl;做
printf-v c'var disabled=“disabled”;打印(%s.name_id);'“$l”
gjs-c“$c”
完成<文件
这不是最有效的,但您可以确保数据总是经过良好的解析<代码>:)
您可以尝试使用
rhino
而不是gjs
,但是rhino
要慢得多。YYMV.如果您想要一个真正有趣的解决方案:
这似乎是。那么为什么不使用JavaScript解释器呢?如果您运行的是gnome shell,那么您已经安装了gjs
(如果没有,您可能也有JS解释器;或者没有)。使用gjsgjs
:
gjs -c 'var disabled="disabled";print({"locale":"en_US","action":null,"name_id":4820951,"time":80239874928,"focus":disabled,"end_data":false}.name_id);'
我必须定义禁用
,这样它才能工作
整洁,嗯
如果您有一个包含类似行的完整文件:
while read -r l; do
printf -v c 'var disabled="disabled"; print(%s.name_id);' "$l"
gjs -c "$c"
done < file
读取时-rl;做
printf-v c'var disabled=“disabled”;打印(%s.name_id);'“$l”
gjs-c“$c”
完成<文件
这不是最有效的,但您可以确保数据总是经过良好的解析<代码>:)
您可以尝试使用
rhino
而不是gjs
,但是rhino
要慢得多。YYMV.这似乎不是CSV
数据。所有行都使用该语法。我将其保存为csv,因为每个类别都用逗号分隔,因为它使用逗号作为分隔符并不意味着它是csv。在本例中,使用大括号、冒号和引号,看起来更像JSON…这似乎不是CSV
data。所有行都使用该语法。我将其保存为csv,因为每个类别都用逗号分隔,因为它使用逗号作为分隔符并不意味着它是csv。在本例中,使用大括号、冒号和引号,看起来更像JSON。。。