Linux端末を使用してログファイルから特定のテキストを抽出する方法は?

Linux端末を使用してログファイルから特定のテキストを抽出する方法は?

次のような多くの行を含むログファイルがあります。

2017-07-16 01:06:07 | 8801624874139 | http://192.168.5.1:2020/credit/purchase/4 | XpressLoan | {"resultCode":0,"resultMessage":"OK","amount":100000,"serviceFee":24400,"totalOutstandingdebt":124400,"msisdn":8801624874139}  
2017-07-16 01:06:24 | 8801628666938 | http://192.168.5.1:2020/credit/purchase/5 | XpressLoan | {"resultCode":0,"resultMessage":"OK","amount":50000,"serviceFee":12180,"totalOutstandingdebt":62180,"msisdn":8801628666938}

上記のログから金額の値をどのように取得できますか?

予想出力:

100000
50000

答え1

組み合わせの使用アッ+ジャック(JSON操作ツール):

awk '{ print $10 }' logfile | jq -r '.amount'

出力:

100000
50000

このアプローチを使用すると、JSONエンコードフィールドから任意の/複数のキー/値を抽出できます。

答え2

この試み:

$ awk -F\" '/amount/ {print $9}' file | sed 's/[:|,]//g'
100000
50000

または:

$ sed 's/^.*amount\":\([0-9]*\),\".*$/\1/' file
100000
50000

編集する

最初のコマンドを awk に再パイプすると、次の例のように、最初のコマンドの出力を要約できます。

$ awk -F\" '/amount/ {print $9}' file | sed 's/[:|,]//g' |\
awk '{sum += $1} END {print sum}'
150000

答え3

awk必要なデータを取得するには、いくつか使用できます。

awk -F"|" {'print $5'}| awk -F"," '{print $3}'| awk -F":" '{print $2}'
  • {}最初のawkはデータを提供します
  • 2番目のawkはあなたに与えるでしょうkey:value
  • 3番目のawkはキーの値を提供します。

フォーマットが変更されても、区切り文字でパターンを認識し、それに合わせて調整する必要があります。

たとえば、

my_var="2017-07-16 01:06:07 | 8801624874139 | http://192.168.5.1:2020/credit/purchase/4 | XpressLoan | {"resultCode":0,"resultMessage":"OK","amount":100000,"serviceFee":24400,"totalOutstandingdebt":124400,"msisdn":8801624874139}"

$ echo $my_var | awk -F"|" {'print $5'}
 {resultCode:0,resultMessage:OK,amount:100000,serviceFee:24400,totalOutstandingdebt:124400,msisdn:8801624874139}

$ echo $my_var | awk -F"|" {'print $5'}| awk -F"," '{print $4}'
serviceFee:24400

$ echo $my_var | awk -F"|" {'print $5'}| awk -F"," '{print $3}'| awk -F":" '{print $2}'
100000

関連情報