sed -e를 사용하여 로그 파일을 구문 분석합니다. 고유한 클래스 이름을 계산해야 합니다.

sed -e를 사용하여 로그 파일을 구문 분석합니다. 고유한 클래스 이름을 계산해야 합니다.

파일이 있습니다. filename.log라고 부르겠습니다. 다음과 같은 내용이 있습니다.

(2014-11-18 14:09:21,766), , xxxxxx.local, EventSystem, DEBUG FtpsFile delay secs is 5 [pool-3-thread-7] 
(2014-11-18 14:09:21,781), , xxxxxx.local, EventSystem, DEBUG FtpsFile disconnected from ftp server [pool-3-thread-7] 
(2014-11-18 14:09:21,798), , xxxxxx.local, EventSystem, DEBUG FtpsFile FTP File  Process@serverStatus on exit  - 113 [pool-3-thread-7] 
(2014-11-18 14:09:21,798), , xxxxxx.local, EventSystem, DEBUG FtpsFile FTP File  Process@serverStatus on exit  - 114 [pool-3-thread-7] 
(2014-11-18 14:09:21,799), , xxxxxx.local, EventSystem, DEBUG JobQueue $_Runnable Finally of consume() :: [pool-3-thread-7] 

가장 자주 디버그 메시지를 생성하는 클래스를 찾으려고 합니다.

이 예에서는 다음을 볼 수 있습니다.FTPS 파일그리고작업 대기열메시지를 생성하는 두 클래스입니다.

나는 이것을 가지고있다

cat filename.log | sed -n -e 's/^.*\(DEBUG \)/\1/p' | sort | uniq -c | sort -rn | head -10

그러면 클래스 이름이 생성되고 가장 일반적인 클래스(상위 10개)가 표시됩니다.

문제는 이것이 수업의 규모를 알려주지 않는다는 것입니다.FTPS 파일4입니다. 각 FtpsFile 로그 파일을 서로 다른 고유 엔터티로 처리합니다.

기본적으로 DEBUG 다음의 첫 번째 단어를 잡고 나머지 개수를 무시하도록 위의 명령을 어떻게 변경합니까?

이상적으로는 4 FtpsFile 1 JobQueue를 얻어야 합니다.

답변1

  • GNU 사용 sed:

    sed 's/.*DEBUG \(\w*\).*/\1/' | uniq -c
          4 FtpsFile
          1 JobQueue
    
  • 그리고 grep:

    grep -Po 'DEBUG \K\w+' | uniq -c
          4 FtpsFile
          1 JobQueue
    
  • 그리고 awk:

    awk '$6=="DEBUG"{print $7}' | uniq -c
          4 FtpsFile
          1 JobQueue
    

마지막 것은 pure 로 수행할 수 있지만 awk유사성을 위해 파이핑합니다 uniq.

답변2

빠른 수정 - 필드를 선택하기 위해 다음 잘라내기 명령을 추가했습니다.

[host:~]$ cat logfile | cut -d" " -f7 | sort | uniq -c | sort -rn | head -10
      4 FtpsFile
      1 JobQueue

KISS에 대한 나의 욕구 때문에 이름에 공백이 있는 수업에서는 작동하지 않습니다.

답변3

sed 대신 awk를 사용하면 관심 있는 필드 앞의 필드를 보지 않고 보고 싶은 부분을 잘라낼 수 있습니다.

[hunter@apollo: ~]$ cat filename.log | awk -F, '{ print $6 }' | cut -c 1-15 | uniq -c | sort -rn | head -10
      4  DEBUG FtpsFile
      1  DEBUG JobQueue

(참고: 두 번 정렬했는데 이는 불필요해 보입니다)

편집: 클래스가 얼마나 오래 지속될지 모르는 경우 (cut 대신) 추가 awk 명령을 추가할 수 있습니다.

[hunter@apollo: ~]$ cat filename.log | awk -F, '{ print $6 }' | awk '{ print $1, $2 }' | uniq -c | sort -rn | head -10
      4 DEBUG FtpsFile
      1 DEBUG JobQueue

관련 정보