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] 

가장 자주 DEBUG 메시지를 생성하는 클래스를 찾으려고 노력하고 있습니다.

이 예에서는 다음을 볼 수 있습니다.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

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

[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

관련 정보