如何在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}'