11

我正在分析的日志包含如下信息:

y1e","email":"","money":"100","coi

我想获取金钱的价值,我使用了“awk”,例如:

grep pay action.log | awk '/"money":"([0-9]+)"/' ,

那么我怎样才能得到 ([0-9]+) 中的子表达式值?

4

5 回答 5

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

于 2012-06-07T02:22:24.960 回答
2

作为替代方案,假设数据格式在行被 grep 后保持不变,这将提取货币字段,而不是使用正则表达式:

awk -v FS=\" '{print $9}' data.txt

假设 data.txt 包含

y1e","email":"","money":"100","coin.log

产生:

100

即,您的字段分隔符设置为"并且您打印出字段 9

于 2012-06-06T12:12:10.093 回答
0

如果你money在不同的地方进来,那么硬编码位置参数可能不是一个好主意。

你可以试试这样的 -

$ awk -v FS=[,:\"] '{ for (i=1;i<=NF;i++) if($i~/money/) print $(i+3)}' inputfile
于 2012-06-06T16:03:28.790 回答
0

您需要引用正则表达式的第 1 组

我不精通 awk,但这里有一些其他相关的问题

awk 从每一行中提取多个组

GNU awk:访问替换文本中捕获的组

希望这可以帮助

于 2012-06-06T11:52:15.653 回答
0
grep pay action.log | awk -F "\n" 'm=gensub(/.*money":"([0-9]+)".*/, "\\1", "g", $1) {print m}'
于 2012-06-07T04:29:27.297 回答