파일이 있습니다. 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