我正在分析日志包含以下信息:
y1e","email":"","money":"100","coi
我想要获取金钱的价值,我曾经使用过' awk'喜欢:
grep pay action.log | awk '/"money":"([0-9]+)"/' ,
那我怎样才能得到([0-9] +)中的子表达式值?
答案 0 :(得分:5)
如果你有GNU AWK(gawk
):
awk '/pay/ {match($0, /"money":"([0-9]+)"/, a); print substr($0, a[1, "start"], a[1, "length"])}' action.log
如果不是:
awk '/pay/ {match($0, /"money":"([0-9]+)"/); split(substr($0, RSTART, RLENGTH), a, /[":]/); print a[5]}' action.log
两者的结果是100
。并且不需要grep
。
答案 1 :(得分:2)
作为替代方案提供,假设数据格式保持相同,一旦线条被grep,这将提取货币字段,而不是使用正则表达式:
awk -v FS=\" '{print $9}' data.txt
假设data.txt包含
y1e","email":"","money":"100","coin.log
得到以下特性:
100
即,您的字段分隔符设置为"
并打印出字段9
答案 2 :(得分:0)
您需要引用正则表达式的第1组
我不会精通awk,但这里还有一些其他相关问题
awk extract multiple groups from each line
GNU awk: accessing captured groups in replacement text
希望这有帮助
答案 3 :(得分:0)
如果您money
来到不同的地方,那么硬编码位置参数可能不是一个好主意。
你可以尝试这样的事情 -
$ awk -v FS=[,:\"] '{ for (i=1;i<=NF;i++) if($i~/money/) print $(i+3)}' inputfile
答案 4 :(得分:0)
grep pay action.log | awk -F "\n" 'm=gensub(/.*money":"([0-9]+)".*/, "\\1", "g", $1) {print m}'