임계값보다 큰 값만 추출하는 방법

임계값보다 큰 값만 추출하는 방법

저는 bash 스크립팅을 처음 접했습니다. 누구든지 다음 문제를 해결하도록 도와줄 수 있나요? 아래에 표시된 출력이 포함된 로그 파일이 있습니다.

logDurationMillis>=950ms로 출력 라인을 찾기 위해 grep을 시도하고 있습니다.

logAlias:Overall,logDurationMillis:382,logTimeStart:2019-07-24_15:30:06.075,logTimeStop:2019-07-24_15:30:06.107
logAlias:Overall,logDurationMillis:388,logTimeStart:2019-07-24_15:30:06.406,logTimeStop:2019-07-24_15:30:06.444
logAlias:Overall,logDurationMillis:545,logTimeStart:2019-07-24_15:30:06.583,logTimeStop:2019-07-24_15:30:06.638
logAlias:Overall,logDurationMillis:961,logTimeStart:2019-07-24_15:30:06.599,logTimeStop:2019-07-24_15:30:06.660
logAlias:Overall,logDurationMillis:640,logTimeStart:2019-07-24_15:30:07.197,logTimeStop:2019-07-24_15:30:07.237
logAlias:Overall,logDurationMillis:934,logTimeStart:2019-07-24_15:30:07.474,logTimeStop:2019-07-24_15:30:07.508
logAlias:Overall,logDurationMillis:336,logTimeStart:2019-07-24_15:30:07.546,logTimeStop:2019-07-24_15:30:07.582

값은 항상 쉼표로 구분된 두 번째 열에 있습니다.

답변1

awk를 사용하세요:

  1. "logDurationMillis"가 두 번째 항목임을 알고 있는 경우:

    awk -F'[:,]' -v limit=950 '$4 >= limit' file
    
  2. 그렇지 않으면

    awk -F'[:,]' -v limit=950 '{
        for (i=1; i<NF; i+=2) 
            if ($i == "logDurationMillis" && $(i+1) >= limit) 
                print
    }' file
    

답변2

파일 이름이 이라고 가정하면 logFile이 명령은 다음을 수행합니다.

egrep ',logDurationMillis:(9[5-9][0-9]|[1-9][0-9]{3,}),' logFile

답변3

또 다른 awk:

awk -F':|,' '$4 > 950' file

인쇄:

logAlias:Overall,logDurationMillis:961,logTimeStart:2019-07-24_15:30:06.599,logTimeStop:2019-07-24_15:30:06.660

고쳐 쓰다(OP 질문으로 인해 :)

다음과 같이 필드를 다시 작성할 수 있습니다.

awk -F':|,' '$4 > 950 {print $3 ":" $4 "," $5 ":" $6 ":" $7 ":" $8 }' file

인쇄:

logDurationMillis:961,logTimeStart:2019-07-24_15:30:06.599

(필드 3-8을 연결하는 더 쉬운 방법이 있을 수 있지만 다른 필드 구분 기호도 다시 만들어야 합니다)

관련 정보