私が分析していたログには、次のような情報が含まれています。
y1e","email":"","money":"100","coi
私はお金の価値を取得したいのですが、私は「awk」を次のように使用しました:
grep pay action.log | awk '/"money":"([0-9]+)"/' ,
次に、([0-9] +)の部分式の値を取得するにはどうすればよいですか?
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
。
別の方法として提供され、行がgrepされた後もデータ形式が同じであると仮定すると、正規表現を使用せずに、moneyフィールドが抽出されます。
awk -v FS=\" '{print $9}' data.txt
data.txtに次のものが含まれていると仮定します
y1e","email":"","money":"100","coin.log
降伏:
100
つまり、フィールドセパレータがに設定され"
、フィールド9を印刷します。
正規表現のグループ1を参照する必要があります
私はawkに堪能ではありませんが、他のいくつかの関連する質問があります
GNU awk:置換テキストでキャプチャされたグループにアクセスする
お役に立てれば
別の場所に来た場合はmoney
、位置パラメータをハードコーディングするのは得策ではないかもしれません。
あなたはこのようなことを試すことができます-
$ awk -v FS=[,:\"] '{ for (i=1;i<=NF;i++) if($i~/money/) print $(i+3)}' inputfile
grep pay action.log | awk -F "\n" 'm=gensub(/.*money":"([0-9]+)".*/, "\\1", "g", $1) {print m}'