CSV 파일에서 읽은 IP 및 타임스탬프가 포함된 JSON 로그 파일의 행을 반환하시겠습니까?

CSV 파일에서 읽은 IP 및 타임스탬프가 포함된 JSON 로그 파일의 행을 반환하시겠습니까?

그래서 저는 쉘 스크립팅을 처음 접했고 도움이 필요합니다. 그래서 내 CSV 파일에서 IP 및 타임스탬프 값이 JSON 로그 파일의 행 항목에 어떻게든 존재하는지 확인하고, 그렇다면 해당 특정 JSON 로그 항목을 다른 파일에 반환하고 싶습니다. 모든 IP 주소에서 작동하도록 일반화하려고 합니다. 샘플 CSV 파일은 아래와 같습니다.

"clientip,""destip","dest_hostname","timestamp"
 "127.0.0.1","0.0.0.0","randomhost","2023-09-09T04:18:22.542Z"

Json 로그 파일의 예제 줄 항목

{"log": "09-Sept-2023 rate-limit: info: client @xyz 127.0.0.1, "stream":"stderr", "time": 2023-09-09T04:18:22.542Z"}

이는 일치 항목이 있을 때 output.txt 파일에 반환하려는 JSON 로그 파일의 줄입니다. JSON 파일에는 CSV와 동일한 필드 및 조직이 없습니다(clientip, destip, dest_hostname, timestamp가 있지만 최소한 JSON 로그 파일의 행을 일치하는 새 파일로 반환할 수 있기를 바랍니다). clientip("info: client @xyz 127.0.0.1"에서 127.0.0.1을 본 것처럼) 및 타임스탬프일 수도 있습니다.

나는 이것을 시도했고 명령 join file.csv xyz-json.log > output.txt 을 시도했지만 awk아무 소용이 없었습니다. 도움을 주시면 정말 감사하겠습니다!

답변1

두 입력 파일의 형식이 각각 CSV 및 JSONL 파일로 적절하다고 가정하면 file.csvMiller file.jsonl( mlr)를 사용하여 JSONL 파일의 키 값에서 클라이언트 IP를 추출한 log다음 이를 키로 사용할 수 있습니다.

두 개의 테스트 입력 파일(이 예에서는 CSV 파일의 따옴표가 선택 사항임):

"clientip","destip","dest_hostname","timestamp"
"127.0.0.1","0.0.0.0","randomhost","2023-09-09T04:18:22.542Z"
{"log": "09-Sept-2023 rate-limit: info: client @xyz 127.0.0.1", "stream": "stderr", "time": "2023-09-09T04:18:22.542Z"}

주문하다:

mlr --jsonl --from file.jsonl \
    put '$clientip = splita($log," ")[-1]' then \
    join -f file.csv -i csv -j clientip then \
    cut -f log,stream,time

먼저 필드 값을 공백으로 분할하고 마지막 단어를 선택하여 clientipJSONL 데이터에 필드를 만듭니다 . log그런 다음 관계를 수행합니다.내부 조인JSONL 데이터를 "오른쪽" 데이터 세트로, CSV 데이터를 "왼쪽" 데이터 세트로 작동합니다. clientip조인 키를 사용하여 조인이 수행됩니다 .

마지막으로 원래 JSONL 데이터에 없었던 조인에 의해 생성된 레코드에서 모든 필드를 제거합니다(처음 두 단계 모두 데이터에 키를 추가했습니다).

조인 키에 두 파일의 타임스탬프도 사용하시겠습니까? 그러면 두 데이터 세트의 필드 이름이 다르기 때문에 가장 쉬운 방법은 데이터에서 키의 JSONL 값을 timestamp사용하는 것 입니다(기본적으로 다음을 사용합니다 ). 새 이름으로 데이터를 복사한 후 다음과 같이 조인하세요.timetime

mlr --jsonl --from file.jsonl \
    put '$clientip = splita($log," ")[-1]; $timestamp = $time' then \
    join -f file.csv -i csv -j clientip,timestamp then \
    cut -f log,stream,time

위 두 명령 중 하나의 출력은 파일로 리디렉션될 수 있으며, 질문의 (수정된) 데이터를 기반으로 출력은 JSONL 입력 데이터와 동일합니다.

관련 정보