Как получить значение подвыражения 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
Ответ 3
Вам нужно указать группу 1 регулярного выражения
Я не уверен в awk, но вот некоторые другие важные вопросы
awk извлекает несколько групп из каждой строки
GNU awk: доступ к захваченным группам в тексте замены
Надеюсь, что это поможет
Ответ 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}'