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는 데이터를 제공합니다
  • 두 번째 awk는 당신에게 줄 것입니다key:value
  • 세 번째 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

관련 정보