일치/일치하지 않는 패턴의 개수를 인쇄하는 방법과 여러 패턴을 줄로 구분하여 인쇄하는 방법

일치/일치하지 않는 패턴의 개수를 인쇄하는 방법과 여러 패턴을 줄로 구분하여 인쇄하는 방법

일치/일치하지 않는 패턴 수를 인쇄하는 방법과 여러 패턴을 줄로 구분하여 인쇄하는 방법.

입력 예( 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번이 0번 발생했음을 나타내기 위해 인쇄되지 않습니다.

원하는 출력:

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];
    }
}

관련 정보