grep을 사용하여 로그 줄의 특정 부분만 출력

grep을 사용하여 로그 줄의 특정 부분만 출력

나는 이런 줄을 가지고있다 -

/mnt/internal-app/logs/internal-app.log_2019-08-21.log.gz:2019-08-21 07:31:14,153 5458142 [XNIO-3 task-4] INFO  c.c.p.i.m.ws.FileManger [FileName.java:1838] - UUIDs in this bucket 8501792126581991569,8073766106536916628,4830289023695906800,6135982080116553120,8306484440313978157,9040948912536460872,8471856544054164043,5431263453539111247,7661719762428556576
/mnt/internal-app/logs/internal-app.log_2019-08-21.log.gz:2019-08-21 07:31:14,153 5458144 [XNIO-3 task-4] INFO  c.c.p.i.m.ws.FileManger [FileName.java:1838] - UUIDs in this bucket 6501792126581991569,8073766106536916628,4830289023695906800,6135982080116553120,8306484440313978157,9040948912536460872,8471856544054164043,5431263453539111247,7661719762428556576

궁극적으로 해야 할 일은 모든 UUID를 수집하고 아래와 같이 SQL 삽입 문을 준비하는 것입니다.

insert into sometable (uuid) values ("6501792126581991569","8073766106536916628")..(..);

그러한 행의 수는 500,000에 가깝습니다. Sublime 텍스트 편집기에서 파일을 열어 정규식을 적용할 수 없습니다.

그래서 grep을 통해 시도하고 있습니다.

나는 이것을 시도했다 -

zgrep "UUIDs in this bucket" /mnt/internal-app/logs/internal-app.log_2019-08-2* | grep -Eo ".* UUIDs in this bucket(.*)" | cut -d: -f5

필요한 것보다 더 많이 인쇄됩니다.

1838] - UUIDs in this bucket 8501792126581991569,8073766106536916628,4830289023695906800,6135982080116553120,8306484440313978157,9040948912536460872,8471856544054164043,5431263453539111247,7661719762428556576

UUID에서만 선택하는 방법은 무엇입니까?

고쳐 쓰다

SQL 쿼리 구문 수정 -

insert into sometable (uuid) values ("6501792126581991569"),("8073766106536916628")..(..);

답변1

그 이후의 모든 숫자를 원하면 다음과 같이 사용할 UUIDs in this bucket수 있습니다 sed.

$ zcat file.gz | sed -n 's/^.*UUIDs in this bucket //p' 
8501792126581991569,8073766106536916628,4830289023695906800,6135982080116553120,8306484440313978157,9040948912536460872,8471856544054164043,5431263453539111247,7661719762428556576
6501792126581991569,8073766106536916628,4830289023695906800,6135982080116553120,8306484440313978157,9040948912536460872,8471856544054164043,5431263453539111247,7661719762428556576

또는 perl을 사용하여 전체 SQL 문을 인쇄하세요.

$ zcat file.gz | perl -ne 'chomp;if(s/^.*UUIDs in this bucket //){@uuids=split(/,/); $k{$_}++ for @uuids} END{ print "insert into sometable (uuid) values (" , join ",",map{qq/"$_"/} keys(%k); print ");\n"}' 
insert into sometable (uuid) values ("6135982080116553120","4830289023695906800","8501792126581991569","9040948912536460872","7661719762428556576","8471856544054164043","8306484440313978157","6501792126581991569","5431263453539111247","8073766106536916628");

또는 약간 더 명확합니다.

$ zcat file.gz | 
    perl -ne 'chomp;
              if(s/^.*UUIDs in this bucket //){
                @uuids=split(/,/); 
                $k{$_}++ for @uuids
              }
              END{
                print "insert into sometable (uuid) values (" , 
                           join ",",map{qq/"$_"/} @uuids; 
                print ");\n"
            }'
insert into sometable (uuid) values ("6501792126581991569","8073766106536916628","4830289023695906800","6135982080116553120","8306484440313978157","9040948912536460872","8471856544054164043","5431263453539111247","7661719762428556576");

답변2

다른 도구를 사용할 의향이 있거나 가능하다면 항상 줄 끝을 원하는 것처럼 보이기 때문에 grep상당히 쉽게 수행할 수 있습니다 . awk예를 들어, 마지막 필드만 인쇄하도록 할 수 있습니다.

zcat /mnt/internal-app/logs/internal-app.log_2019-08-2* | awk '/UUIDs in this bucket/ {print $NF}'

zgrepPerl 스타일 정규식을 지원하지 않는 형식이 있는지는 모르겠지만 , 귀하의 형식이 지원한다고 가정하면 다음과 같이 할 수 있습니다.

zgrep -Po 'UUIDs in this bucket \K.*' /mnt/internal-app/logs/internal-app.log_2019-08-2*

왜냐하면 \K패턴은 일치의 일부로 그 이전의 모든 것을 계산하지 말라고 지시하기 때문입니다. 따라서 이것은 경기 후에 일어난 일만 인쇄합니다.

답변3

perlSQL 코드를 생성하는 또 다른 방법:

zcat -f /mnt/internal-app/logs/internal-app.log_2019-08-2* |
  perl -lne 'BEGIN{$"=q(",")}
             @u = m{(?:UUIDs in this bucket |\G,)\K\d+}g;
             print qq(insert into sometable (uuid) values ("@u");) if @u'

관련 정보