我正在分析的日志包含如下信息:
y1e","email":"","money":"100","coi
我想获取金钱的价值,我使用了“awk”,例如:
grep pay action.log | awk '/"money":"([0-9]+)"/' ,
那么我怎样才能得到 ([0-9]+) 中的子表达式值?
如果您有 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
。
作为替代方案,假设数据格式在行被 grep 后保持不变,这将提取货币字段,而不是使用正则表达式:
awk -v FS=\" '{print $9}' data.txt
假设 data.txt 包含
y1e","email":"","money":"100","coin.log
产生:
100
即,您的字段分隔符设置为"
并且您打印出字段 9
如果你money
在不同的地方进来,那么硬编码位置参数可能不是一个好主意。
你可以试试这样的 -
$ awk -v FS=[,:\"] '{ for (i=1;i<=NF;i++) if($i~/money/) print $(i+3)}' inputfile
grep pay action.log | awk -F "\n" 'm=gensub(/.*money":"([0-9]+)".*/, "\\1", "g", $1) {print m}'