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

如何在awk中获取regExp的子表达式值?,regex,linux,awk,Regex,Linux,Awk,我正在分析包含以下信息的日志: y1e","email":"","money":"100","coi 我想获得金钱的价值,我用了“awk”这样的词: grep pay action.log | awk '/"money":"([0-9]+)"/' , 那么如何在([0-9]+)中获得子表达式值?您需要引用正则表达式的组1 我对awk不是很流利,但这里有一些其他相关的问题 希望这有助于作为替代方案提供,假设行变灰后数据格式保持不变,这将提取货币字段,而不是使用正则表达式: awk -v F

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

y1e","email":"","money":"100","coi
我想获得金钱的价值,我用了“awk”这样的词:

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

那么如何在([0-9]+)中获得子表达式值?

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

我对awk不是很流利,但这里有一些其他相关的问题


希望这有助于

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

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

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

100

也就是说,您的字段分隔符设置为
,并且您打印出字段9

如果您有
从不同的地方进入,那么硬编码位置参数可能不是一个好主意

你可以试试这样的-

$ awk -v FS=[,:\"] '{ for (i=1;i<=NF;i++) if($i~/money/) print $(i+3)}' inputfile
$awk-vfs=[,:\“]'{for(i=1;i如果您有GNUawk(
gawk
):

如果没有:

awk '/pay/ {match($0, /"money":"([0-9]+)"/); split(substr($0, RSTART, RLENGTH), a, /[":]/); print a[5]}' action.log

任何一个的结果都是
100
。而且不需要
grep

来澄清,您需要
后面的数值。sed版本将是:
sed-r's | ^.*money:“([0-9]*)”*\1 |“
或者如果您不想打印不包含
money的行:
sed-n-r's | ^..*([0-9])”.$|\1 | p'
@Op De Cirkel谢谢!似乎“sed”更强大!为什么“awk”没有这样的设计?谢谢!受“gensub”的启发,我得到了grep pay user_action.log | awk-F“\n”'m=gensub(/.*money):“([0-9]+)*/,“\\1”,“g”,“1”){print m}'谢谢。但是我想知道awk是如何获取组1值的。谢谢。但是包含“money”信息的字段可能不固定!我想到了另一种方法:grep pay action.log | awk-F“\n”'m=gensub(/.*money):“([0-9]+)*/,“\\1”,“g”,$1){print m}“谢谢。非常接近我的预期,但还有更聪明的方法吗?@RoyHu:array索引中的1指的是捕获组。我不知道在awk或gawk中还有其他方法可以做到这一点。gawk有一个函数
gensub()
可以用来替换捕获组的内容。您可以使用它,但在您的问题中使用的表达式会更复杂。谢谢。我使用gensub:grep pay action.log | awk-F“\n”'m=gensub(/.*money):“([0-9]+)*/,“\\1”,“g”,“$1”){print m}'如果您安装了
gawk
,在第一个示例中,print子句可以简化为
print a[1];
您应该重构
grep
。记住
grep'foo'文件| awk'{bar}
基本上最好写成
awk'/foo/{bar}'文件
grep pay action.log | awk -F "\n" 'm=gensub(/.*money":"([0-9]+)".*/, "\\1", "g", $1) {print m}'
grep pay action.log | awk -F "\n" 'm=gensub(/.*money":"([0-9]+)".*/, "\\1", "g", $1) {print m}'