파이프를 사용하여 파일을 검색하는 Linux 명령

파이프를 사용하여 파일을 검색하는 Linux 명령

질문:파일 /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및 을 사용할 수도 있지만 cutIMHO 이러한 도구는 작업에 비해 너무 "간단"합니다. 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

관련 정보