11

私が分析していたログには、次のような情報が含まれています。

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

私はお金の価値を取得したいのですが、私は「awk」を次のように使用しました:

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

次に、([0-9] +)の部分式の値を取得するにはどうすればよいですか?

4

5 に答える 5

5

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

于 2012-06-07T02:22:24.960 に答える
2

別の方法として提供され、行がgrepさ​​れた後もデータ形式が同じであると仮定すると、正規表現を使用せずに、moneyフィールドが抽出されます。

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

data.txtに次のものが含まれていると仮定します

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

降伏:

100

つまり、フィールドセパレータがに設定され"、フィールド9を印刷します。

于 2012-06-06T12:12:10.093 に答える
0

正規表現のグループ1を参照する必要があります

私はawkに堪能ではありませんが、他のいくつかの関連する質問があります

awkは各行から複数​​のグループを抽出します

GNU awk:置換テキストでキャプチャされたグループにアクセスする

お役に立てれば

于 2012-06-06T11:52:15.653 に答える
0

別の場所に来た場合はmoney、位置パラメータをハードコーディングするのは得策ではないかもしれません。

あなたはこのようなことを試すことができます-

$ awk -v FS=[,:\"] '{ for (i=1;i<=NF;i++) if($i~/money/) print $(i+3)}' inputfile
于 2012-06-06T16:03:28.790 に答える
0
grep pay action.log | awk -F "\n" 'm=gensub(/.*money":"([0-9]+)".*/, "\\1", "g", $1) {print m}'
于 2012-06-07T04:29:27.297 に答える