如何在awk中获取regExp的子表达式值?

时间:2012-06-06 11:47:49

标签: regex linux awk

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

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

我想要获取金钱的价值,我曾经使用过' awk'喜欢:

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

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

5 个答案:

答案 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}'