13.5테라바이트에서 90기가의 데이터를 추출했습니다.
sort -u | uniq
13.5T의 syslog 데이터에서 awk'd된 데이터를 시도했습니다 .
일부 잘못된 데이터가 분명했기 때문에 다음과 같이 awk 및 'seen'을 사용하여 구문 분석을 다시 실행했습니다.
awk -F, '!seen[$1]++' inputfile > outputfile
이것은 가장 시간 효율적인 방법으로 판명되었지만 일부 잘못된 데이터도 포함되어 있습니다. 잘못된 로그 항목이 있거나 uniq'ing 및 awk'ing 정렬에서 일부 행이 지워졌을 수도 있습니다. 샘플 크기가 충분히 크기 때문에 원본 데이터를 구문 분석하는 더 나은/더 나은 방법이 있는지 여부는 신경 쓰지 않습니다. 즉, 13.5T에서 약간의 데이터를 잃어도 괜찮다는 의미입니다.
유효한 라인당 3개의 IP 주소가 있습니다.
IP 주소에는 마침표가 3개 있으므로 9개의 "."이 있는 행만 구문 분석할 수 있는 것이 필요합니다.
답변1
이것을 테스트 파일로 사용하겠습니다.
$ cat testfile
1.2.3.4 5.6.7.8 9.10.11.12 Keep
1.2.3.4 5.6.7.8 9.10.11 Bad: Missing 1
1.2.3.4 5.6.7.8 9.10.11.12. Bad: Extra period
grep 사용
정확히 9개의 마침표가 있는 라인을 선택하려면 다음을 수행합니다.
$ grep -E '^([^.]*\.){9}[^.]*$' testfile
1.2.3.4 5.6.7.8 9.10.11.12 Keep
[^.]*\.
a는 마침표가 아닌 문자의 수에 관계없이 뒤에 ([^.]*\.){9}
마침표가 오는 0개 이상의 마침표가 아닌 문자로 구성된 정확히 9개의 시퀀스와 일치합니다. 시작 부분 ^
에서는 줄의 시작 부분에서 시작하는 정규식 일치가 필요합니다. [^.]*$
이는 9개의 시퀀스 끝과 줄 끝 사이에 마침표가 아닌 문자만 허용된다는 의미입니다 .
sed 사용
$ sed -En '/^([^.]*\.){9}[^.]*$/p' testfile
1.2.3.4 5.6.7.8 9.10.11.12 Keep
이 -n
옵션은 명시적으로 요청하지 않는 한 sed에게 인쇄하지 않도록 지시합니다. 다음 p
정규식은 sed에게 정규식과 일치하는 행을 인쇄하도록 명시적으로 요청합니다.
awk 사용
$ awk '/^([^.]*\.){9}[^.]*$/' testfile
1.2.3.4 5.6.7.8 9.10.11.12 Keep
또는 awk의 기능을 사용하여 필드를 구분하는 문자를 정의할 수 있습니다(팁:제프 샬러):
$ awk -F. 'NF==10' testfile
1.2.3.4 5.6.7.8 9.10.11.12 Keep