sed/awk를 사용하여 이 로그 항목을 올바른 형식의 csv 파일로 변환할 수 있습니까? 나는 sed/awk를 사용하여 이를 수행하는 여러 가지 방법을 시도했습니다. 불행히도 저는 할 수 없습니다. Perl에서 하기 전에는요. AWK/sed 또는 bash에서도 이것이 가능합니까?
Jan 21 11:10:45 hostname.internal.nl THREAT 2015/01/21 11:10:44 critical 5 reset-both outside 10.10.10.10 inside 10.16.61.4 tcp 39898 80 web-browsing any Bash Remote Code Execution Vulnerability(36731)
이와 같이
Date | Hostname | Threat | DATE+time | Critical/High | Count | --- | External IP | Internal IP | TCP/UDP | Port | External Port| Category | Vulnerability
Jan 21 11:10:45 | hostname.internal.nl | THREAT | 2015/01/21 11:10:44 | critical 5 reset-both | outside 10.10.10.10 | inside 10.16.61.4 | tcp 39898 | 80 | web-browsing | 4any Bash Remote Code Execution Vulnerability(36731)
답변1
예, Bash에서 이 작업을 수행할 수 있지만 왜 그렇게 하려는지는 모르겠습니다. 순수한 bash 솔루션은 다음과 같습니다.
$ while read -r mon day time host threat date time crit count sugg out exip \
in inip tcp port export cat vuln; do
printf "%s | " "$mon $day $time" "$host" "$threat" "$date $time" \
"$crit $count $sugg" "$out $exip" "$in $inip" "$tcp \
$port" "$export" "$cat" "$vuln"
done < file; printf "\n"
Jan 21 11:10:44 | hostname.internal.nl | THREAT | 2015/01/21 11:10:44 | critical 5 reset-both | outside 10.10.10.10 | inside 10.16.61.4 | tcp 39898 | 80 | web-browsing | any Bash Remote Code Execution Vulnerability(36731) |
Perl이나 awk로 더 나은 방법을 제공할 수 있지만 필드를 얼마나 정확하게 정의하는지에 따라 달라집니다. 질문을 더 자세한 내용으로 업데이트하면(예: 키 필드에 항상 3개의 단어가 있습니까? 입력에서 항상 동일한 것이 무엇인지, 무엇을 변경할 수 있는지 알아야 합니다) 더 좋은 솔루션을 제공할 수 있습니다.
답변2
입력 라인의 유형이 동일한 경우 다음을 수행할 수 있습니다.
#!/bin/bash
LOG="/root/1.txt"
echo "Date | Hostname | Threat | DATE+time | Critical/High | Count | --- | External IP | Internal IP | TCP/UDP | Port | External Port | Category | Vulnerability" > 1.csv
< $LOG awk '{print $1" "$2" "$3 " | " $4 " | " $5 " | " $6" "$7 " | " $8" "$9" "$10 " | " $11" "$12 " | " $13" "$14 " | " $15" "$16 " | " $17 " | " $18 " | " $19" "$20" "$21" "$22" "$23" "$24}' >> 1.csv
입력하다:
Jan 21 11:10:45 hostname.internal.nl THREAT 2015/01/21 11:10:44 critical 5 reset-both outside 10.10.10.10 inside 10.16.61.4 tcp 39898 80 web-browsing any Bash Remote Code Execution Vulnerability(36731)
Jan 22 11:12:45 hostname2.internal.nl THREAT2 2015/01/22 12:10:44 critical2 52 reset-both2 outside2 10.10.10.12 inside2 10.16.61.42 udp 39899 82 web-browsing2 any2 Bash Remote Code Execution Vulnerability(36731)2
산출:
Date | Hostname | Threat | DATE+time | Critical/High | Count | --- | External IP | Internal IP | TCP/UDP | Port | External Port | Category | Vulnerability
Jan 21 11:10:45 | hostname.internal.nl | THREAT | 2015/01/21 11:10:44 | critical 5 reset-both | outside 10.10.10.10 | inside 10.16.61.4 | tcp 39898 | 80 | web-browsing | any Bash Remote Code Execution Vulnerability(36731)
Jan 22 11:12:45 | hostname2.internal.nl | THREAT2 | 2015/01/22 12:10:44 | critical2 52 reset-both2 | outside2 10.10.10.12 | inside2 10.16.61.42 | udp 39899 | 82 | web-browsing2 | any2 Bash Remote Code Execution Vulnerability(36731)2
답변3
저는 이것이 S3 Cloudfront에서 로그 파일을 수집하고 Google Drive에 로드하는 데 매우 유용하다는 것을 알았습니다.
저는 homebrew awscli를 사용하여 설치한 후 Mac-Os에서 awscli를 사용하고 있습니다. 나는 다음 명령을 실행했습니다.
aws s3 sync s3://bucketname/domain/ .
버킷은 클라우드 프런트엔드 로그(클라우드 프런트엔드 편집에서 이 기능을 켰습니다)로 채워지고 모든 파일은 내 로컬 컴퓨터로 가져옵니다. .gz 파일의 압축을 풀고 텍스트 파일을 얻었습니다.
그런 다음 동일한 폴더에 아래 설명과 같이 find + exec 명령을 사용하여 큰 로그 파일을 빌드합니다. 그 후 로그를 cloudfront 로그 형식으로 나누고 쉼표를 구분 기호로 사용하여 awk에서 CSV 파일을 생성했습니다. CSV는 일부 피벗 분석을 위해 Google 드라이브에 업로드되었으며 잘못된 가장자리와 누락된 파일을 찾는 데 도움이 되었습니다.
여기에 내가 사용하는 bash 스크립트가 있습니다:
`#!bash/bin
#Join Logs into one Big File using cat , if there are any default headers on your files . you need to remove them
FILE_NAMES_START = 'E1I*'
find . -type f -name FILE_NAMES_START -exec cat {} + >> big_log_file.txt
#Output Log File
LOG="big_log_file.txt"
echo "DATE , TIME , X-Edge-Location , SC-Bytes , Client-IP , Method , Cs-Host , File-URI , HTTP Status , Referer , User Agent , URI Query , Cookie-Id , Edge-Result , Edge-Request-ID , Host Header , Protocol , Bytes , Time Taken , X-Forwader , SSL Protocol , SSL Cipher , CDN-Result-Type" >> csv_data.csv
< $LOG awk '{print $1 " , " $2" , " $3 " , " $4 " , " $5 " , " $6 " , " $7 " , " $8 " , " $9 " , " $10 " , " $11 " , " $12 " , " $13 " , " $14 " , " $15 " , " $16 " , " $17 " , " $18 " , " $19 " , " $20 " , " $21 " , " $22 " , " $23 " , " $24}' >> big_csv_file.csv`
txt 파일과 이 bash 코드가 동일한 라이브러리에 있는지 확인하거나 필수 /를 스크립트에 추가하세요.
csv > 100Mb는 Google 스프레드시트에서 제대로 작동하지 않습니다.