Como extrair texto específico de um arquivo de log usando o terminal linux?

1

Eu tenho um arquivo de log que contém muita linha como abaixo:

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}

No log acima, como posso obter o valor da quantia?

Resultado esperado:

100000
50000
    
por Rezuan 15.07.2017 / 21:13

3 respostas

1

Tente isto:

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

OR:

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

EDITAR

Você pode resumir a saída do primeiro comando se você canalizar novamente para awk como este exemplo:

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

Use a combinação de awk + jq (ferramenta de manipulação JSON):

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

A saída:

100000
50000

Com esse tipo de abordagem, você poderá extrair qualquer / várias chaves / valores do seu campo codificado em JSON

    
por 15.07.2017 / 22:04
1

Poderia usar vários awk para obter os dados necessários.

awk -F"|" {'print $5'}| awk -F"," '{print $3}'| awk -F":" '{print $2}'
  • o primeiro awk leva você ao {} data
  • o segundo awk lhe dará o key:value
  • o terceiro awk lhe dará o valor da chave

mesmo se o formato for alterado, o padrão deve ser identificado pelos separadores e ajustado de acordo.

por exemplo:

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
    
por 16.07.2017 / 01:27

Tags