Как получить значение подвыражения regExp в awk?

Я анализировал журналы, содержащие следующую информацию:

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

Я хочу получить стоимость денег, я использовал awk как:

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

то как я могу получить значение подвыражения в ([0-9] +)?

Ответ 1

Если у вас есть 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.

Ответ 2

Предлагается в качестве альтернативы, если формат данных остается таким же, как только строки будут grep'ed, это будет извлекать денежное поле, не используя регулярное выражение:

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

при условии, что data.txt содержит

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

получая:

100

I.e., ваш разделитель полей установлен на ", и вы распечатываете поле 9

Ответ 4

Если у вас есть money, входящий в разные места, возможно, было бы неплохо скомпоновать позиционный параметр.

Вы можете попробовать что-то вроде этого -

$ awk -v FS=[,:\"] '{ for (i=1;i<=NF;i++) if($i~/money/) print $(i+3)}' inputfile

Ответ 5

grep pay action.log | awk -F "\n" 'm=gensub(/.*money":"([0-9]+)".*/, "\\1", "g", $1) {print m}'