시스템 로그에 추가된 파일별 항목

시스템 로그에 추가된 파일별 항목

평소와 마찬가지로 syslog다음을 통해 항목 내용을 확인할 수 있습니다.

cat /var/log/syslog | grep myentry

myentry특정 파일에 모든 줄을 추가 해야 합니다 . 물론, 위 명령의 출력을 파일로 리디렉션하는 것만으로는 작동하지 않습니다. 왜냐하면 마지막에 추가했더라도 모든 줄을 추가하기 때문입니다.

syslog내 마음에 떠오른 첫 번째 해결책은 대상 파일의 마지막 줄을 찾을 때까지 모든 줄을 반복하는 것이었습니다 . 그런 다음 아래에 모든 내용을 추가할 수 있습니다. 이 작업을 주기적으로 수행하면(즉, cronjob을 사용하거나 bash에서 더 간단하게 시간 제한 루프를 사용하여) 트릭을 수행해야 합니다.

동일한 작업을 수행하는 더 스마트하고 우아한 방법이 있습니까?

편집하다

terdon의 요청을 추가했습니다.

내 시스템 로그의 예:

Jan 17 13:03:18 stm32mp1-abc local2.info chat[15782]: CONNECT
Jan 17 13:03:18 stm32mp1-abc local2.info chat[15782]:  -- got it
Jan 17 13:03:18 stm32mp1-abc user.info myentry[14300]: Ready
Jan 17 13:03:18 stm32mp1-abc local2.info chat[15782]: send (^M)
Jan 17 13:03:18 stm32mp1-abc user.info myentry[14300]: Init complete
Jan 17 13:03:18 stm32mp1-abc daemon.info pppd[14362]: Serial connection established.
Jan 17 13:03:18 stm32mp1-abc daemon.info pppd[14362]: Using interface ppp0

추가하려는 기존 파일의 예:

Jan 17 13:03:18 stm32mp1-abc user.info myentry[14300]: Ready

이 두 파일의 예상 최종 출력은 다음과 같습니다.

Jan 17 13:03:18 stm32mp1-abc user.info myentry[14300]: Ready
Jan 17 13:03:18 stm32mp1-abc user.info myentry[14300]: Init complete

고쳐 쓰다

알았어, 나한테 필요한 것 같아매우내 설명에 관계없이 특히 예를 들어 보겠습니다. 새로운 예:

시스템 로그

Jan 17 13:03:18 stm32mp1-abc local2.info chat[15782]: CONNECT
Jan 17 13:03:18 stm32mp1-abc local2.info chat[15782]:  -- got it
Jan 17 13:03:18 stm32mp1-abc user.info myentry[14300]: Ready
Jan 17 13:03:18 stm32mp1-abc local2.info chat[15782]: send (^M)
Jan 17 13:03:18 stm32mp1-abc user.info myentry[14300]: Init complete
Jan 17 13:03:18 stm32mp1-abc daemon.info pppd[14362]: Serial connection established.
Jan 17 13:03:18 stm32mp1-abc user.info myentry[14300]: Start operations
Jan 17 13:03:18 stm32mp1-abc daemon.info pppd[14362]: Using interface ppp0

전류 출력

Jan 17 13:03:18 stm32mp1-abc user.info myentry[14300]: Init complete

새로운 출력

Jan 17 13:03:18 stm32mp1-abc user.info myentry[14300]: Init complete
Jan 17 13:03:18 stm32mp1-abc user.info myentry[14300]: Start operations

명확해야 합니다.

  1. output파일이 비어 있으면 모든 줄 syslog/myentries을 추가합니다.
  2. output파일이 비어 있지 않으면 모두 추가다음 syslog/myentries행(일치하는 행에서)
  3. output파일이 비어 있지 않고 일치하는 항목이 없는 경우 에도 모두 추가합니다.다음 syslog/myentries행(마지막 타임스탬프 이후)

언급한 대로 무차별 대입을 사용하여 이 작업을 수행할 수 있습니다. 모든 행을 반복하고 조건을 확인하고 필요한 경우 추가합니다.

항목을 자동으로 분할하는 제안 과 같은 더 간단한 솔루션을 찾고 있었지만 syslog방법을 찾지 못했습니다.

답변1

기존 대상 파일의 마지막 줄을 저장합니다. 그런 다음 다음 명령을 사용하여 시스템 로그 awk파일을 역방향으로 구문 분석합니다 tac.

p=$(tail -n1 output)
tac syslog | awk -v p="$p" '$0 == p{exit} /myentry/' | tac >> output

마지막 행이 발견되면(뒤로) awk종료됩니다 . 찾을 수 없거나 출력이 처음에 비어 있으면 전체 파일을 구문 분석합니다(처음에 비어 있는 출력에 대해 syslog에 빈 줄이 없다고 가정합니다). 이번에도 이런 방식으로 필요한 최소 라인 수를 검색하므로 대용량 파일에 대해서는 좋은 성능을 발휘할 것으로 예상됩니다.


또한 다음과 같은 간단하고 효과적인 명령을 도구 상자에 보관하세요.

awk '!seen[$0]++' output > output.tmp && mv output.tmp output

순서를 유지하면서 언제든지 대상 파일을 수정하기 위해 실행할 수 있습니다(어떤 이유로든 중복 파일이 거기에 도달하는 경우).

답변2

간단한 방법은 다음과 같습니다.

$ awk 'NR==FNR{a[$0]++; next}/myentry/ &&  !a[$0]' myentries syslog 
Jan 17 13:03:18 stm32mp1-abc user.info myentry[14300]: Init complete

이렇게 하면 일치하는 새 줄이 선택되므로 원본 파일로 리디렉션하기만 하면 됩니다.

awk 'NR==FNR{a[$0]++; next}/myentry/ &&  !a[$0]' myentries syslog >> myentries

관련 정보