마침표가 9개인 줄만 구문 분석

마침표가 9개인 줄만 구문 분석

13.5TB에서 90GB의 데이터를 추출했습니다.

sort -u | uniq13.5T의 syslog 데이터에서 awk 처리 데이터를 시도했습니다 .

일부 잘못된 데이터가 분명했기 때문에 다음과 같이 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

관련 정보