평소와 마찬가지로 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
명확해야 합니다.
output
파일이 비어 있으면 모든 줄syslog/myentries
을 추가합니다.output
파일이 비어 있지 않으면 모두 추가다음syslog/myentries
행(일치하는 행에서)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