일치/비일치 패턴의 개수를 인쇄하는 방법과 여러 패턴을 선으로 구분하여 인쇄하는 방법

일치/비일치 패턴의 개수를 인쇄하는 방법과 여러 패턴을 선으로 구분하여 인쇄하는 방법

일치/비일치 패턴 수를 인쇄하는 방법과 여러 패턴을 선으로 구분하여 인쇄하는 방법입니다.

입력 예( test.log):

This 23 line has eight 8888
This 11 line has three 3333
need 12 to separate eight and three 3333
eight 32 is greater than three 8888
three 13 is less than eight 3333
three 14 is printed more than eight 3333

원하는 출력:

8888:4
3333:2
5555:0
This 11 line has three 3333
need 12 to separate eight and three 3333
three 13 is less than eight 3333
three 14 is printed more than eight 3333
============================================
This 23 line has eight 8888
eight 32 is greater than three 8888
==========================================

내가 지금까지 시도한 것 :

  1. 행 수를 가져옵니다.egrep -o '8888|3333|5555' test.log | sort| uniq -c

산출:

4 3333
2 8888

0 5555그러나 test.log 파일에 5번 항목이 전혀 없음을 나타내기 위해 인쇄되지 않습니다.

원하는 출력:

4 3333
2 8888
0 5555
  1. egrep '8888|3333' test.log | sort -V

이 출력은 예상한 대로 정렬되지 않고 알파벳순으로 정렬됩니다. 이는 다음과 같습니다.

This 11 line has three 3333
need 12 to separate eight and three 3333
three 13 is less than eight 3333
three 14 is printed more than eight 3333
============================================
This 23 line has eight 8888
eight 32 is greater than three 8888
==========================================

답변1

원하는 작업을 쉽게 수행하기 위해 찾고 있는 프로그램을 이라고 합니다 awk. :-)

일치하는 RE 패턴에 대한 프로그래밍 작업을 수행할 수 있습니다.

awk예제 입력 및 지정된 패턴에 대해 작동해야 하는 테스트되지 않고 단순화된 기계적인 예제 프로그램:

BEGIN {
    eights = 0;
    fives = 0;
    threes = 0;
}
/8888/ {
    eightln[eights] = $0;
    eights++;
}
/5555/ {
    fiveln[fives] = $0;
    fives++;
}
/3333/ {
    threeln[threes] = $0;
    threes++;
}
# ... and so on
END {
    printf("%d 8888\n", eights);
    printf("%d 5555\n", fives);
    printf("%d 3333\n", threes);
    for (i = 0; i < eights; i++) {
        print eightln[i];
    }
    print "=========="
    for (i = 0; i < fives; i++) {
        print fiveln[i];
    }
    print "=========="
    for (i = 0; i < threes; i++) {
        print threeln[i];
    }
}

관련 정보