>

일치/일치하지 않는 패턴의 개수를 인쇄하고 여러 패턴을 한 줄로 분리하여 인쇄하는 방법.

입력 예 ( 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
==========================================

지금까지 시도한 것 :

<올> 줄 수를 얻으려면
  • : egrep -o '8888|3333|5555' test.log | sort| uniq -c
  • 출력 :

    4 3333
    2 8888
    
    

    하지만 0 5555 를 인쇄하지 않습니다  파일에서 5가 0으로 나타나지 않음 test.log

    원하는 결과 :

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

    관련 자료

  • 이전 history - UNIX 단일 사용자 대 다중 사용자 모드 구별은 언제 처음 도입 되었습니까?
  • 다음 shell script - 다른 파일을 열지 않고 어떻게 비교할 수 있습니까?