Bash 匹配字符串后提取数字

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;

我有一个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; 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解释器;或者没有)。使用gjs
gjs

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解释器;或者没有)。使用gjs
gjs

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。。。