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