질문:파일 /var/log/syslog
과 /var/log/syslog.1
.
tr
- 모든 프로세스가 동일하게 표시되도록 프로세스 번호를 제거합니다.cut
- 프로세스 이름만 표시합니다.
uniq
그리고 , sort
, 명령을 사용해야 할 것 같습니다 head
.
답변1
서비스 이름은 syslog 로그 파일(기본 syslog 설정이 있는 Ubuntu 시스템에 있음)의 다섯 번째 열에 있습니다. 일반적으로 servicename[pid]:
, 예를 들어 CRON[1233]:
또는 ntpd[9283]:
등 으로 표시됩니다 .
다섯 번째 필드를 가져옵니다.
awk '{ print $5 }' /var/log/syslog
이 필드의 모든 항목을 삭제하려면 [
:
awk '{ sub("[[].*", "", $5); print $5 }' /var/log/syslog
이제 다음과 비슷한 목록이 표시됩니다.
dhclient
dhclient
dhclient
CRON
ntpd
CRON
CRON
ntpd
이제 정렬하고 개수를 세어 맨 위에 있는 항목을 유지하면 됩니다.
awk '{ sub("[[].*", "", $5); print $5 }' /var/log/syslog |
sort | uniq -c | sort -rn | head -n 5
이는 다음과 같이 출력될 수 있습니다.
27 dhclient
23 CRON
13 ntpd
(이 특정 시스템에는 세 가지 서비스만 있습니다.)
숫자를 제거하려면 로 필터링하세요 awk '{ print $2 }'
.
tr
및 을 사용할 수도 있지만 cut
IMHO 이러한 도구는 작업에 비해 너무 "간단"합니다. cut
특별히 알아야 할 사항정확히잘라낼 구분 기호 수. 열이 여러 공백 문자로 구분된 경우 cut
이를 고려해야 합니다.
답변2
tr
여기에 적합하지 않은 문자를 무분별하게 음역하는 것은 tr -d 0-9
서비스 이름을 포함한 모든 십진수를 제거합니다. 구분 기호 시퀀스를 구분 기호 시퀀스로 압축하여 cut
사용할 수 있도록 하는 것이 유용할 수 있습니다.
서비스 이름이 포함된 열을 찾아 여기에서 서비스 이름을 추출해야 합니다.
어떤 열인지는 syslog 구성 방식, 특히 타임스탬프 형식에 따라 다릅니다.
다음과 같은 내용을 볼 수 있습니다.
2018-03-13T07:17:01.506581-07:00 host CRON[26456]: (root) CMD (...)
여기서 서비스 이름은 세 번째 열에 있습니다.
Mar 14 00:35:01 host CRON[19234]: (root) CMD (...)
다섯 번째 열에 있습니다.
후자 형식에서는 월과 일 열 사이에 1~2개의 공백이 있을 수 있습니다( tr -s ' '
원하는 경우 사용할 수 있음 cut
). 또한 이 [pid]
섹션이 존재한다고 보장할 수는 없습니다(예: 커널 로그 또는 네트워크를 통해 수신된 로그(후자는 "서비스" 열이 없을 수도 있음)).
이 두 가지 다른 형식에 작동하는 방법(GNU grep 또는 호환 가능한 PCRE 지원 방법 사용)은 다음과 같습니다.
grep -Po '^.{7}\S+ \S+ \K[^\s:[]+' /var/log/syslog |
sort |
uniq -c |
sort -rn |
head -n 5
즉, 처음 7자와 그 뒤의 공백이 아닌 모든 문자(두 형식 모두의 타임스탬프에 적용됨)와 추가 열(두 공백 사이: 호스트 이름)을 건너뛴 다음 공백, 콜론 및 뒤( 의 시작 표시 표시 ) \S+
를 제외하고 일치합니다. 일치하는 섹션).]
\K
정규식 기반 접근 방식인 여기에서는 보다 풍부한 기능을 갖춘 Perl과 유사한 접근 방식이 사용되어 더 큰 유연성을 제공합니다. 같은 표현 cut
은 다음과 같습니다.
</var/log/syslog cut -c 8- |
cut -d ' ' -f3 |
cut -d : -f 1 |
cut -d '[' -f 1 |
sort |
uniq -c |
sort -rn |
head -n 5