awk에 로그 파일과 일치하는 조건이 있는지 확인하세요.

awk에 로그 파일과 일치하는 조건이 있는지 확인하세요.

auth.log 파일에서 허용된 sshd 연결을 확인하고 발견된 경우 조치를 취하고 싶습니다.

이것은 내 코드입니다.

tail -f /var/log/auth.log | awk '{ if($0 ~ /sshd/ && $0 ~ /Accepted/) { system("echo FOUND") } }'

어떤 이유로 이것은 출력을 생성하지 않습니다. 누군가 이유를 설명할 수 있나요?

답변1

귀하의 문제는 버퍼링과 관련이 있다고 생각합니다 tail -f.

~$ tail auth.log | awk '{ if($0 ~ /sshd/ && $0 ~ /Accepted/) { system("echo FOUND") } }'
FOUND
FOUND

작동 tail하지만 다음과 같이 실패합니다 tail -f.

~$ tail -f auth.log | awk '{ if($0 ~ /sshd/ && $0 ~ /Accepted/) { system("echo FOUND") } }'
^C

사용할 수 있는 해결 방법은 while루프를 사용하여 각 행을 읽는 것 입니다 tail -f.

~$ tail -f auth.log | while read line
> do
>     echo $line | awk '{ if($0 ~ /sshd/ && $0 ~ /Accepted/) { system("echo FOUND")} }'
> done
FOUND
FOUND

--

검색하다가 다음 옵션을 찾았습니다 man awk(그러나 이것은 버전입니다...).buffer-Wmawk

-W interactive

    버퍼링되지 않은 쓰기를 stdout으로 설정하고 라인 버퍼 읽기를 stdin으로 설정합니다. stdin의 레코드는 값에 관계없이 줄입니다 RS.

반품:

mawk-W i" " 및 " -Wi" 와 같은 옵션에 대한 약어를 허용합니다 ...

~$ tail -f auth.log | awk  -Wi  '/sshd/ && /Accepted/ {system("echo FOUND")}'
FOUND
FOUND

답변2

awk 호출을 사용하여 fflush()출력을 새로 고칠 수도 있습니다.

tail -f /var/log/auth.log | 
    awk '{ if($0 ~ /sshd/ && $0 ~ /Accepted/) { fflush(); system("echo FOUND") } }'

즉, awk복잡성 수준은 불필요합니다. 필요한 것은 다음과 같습니다.

tail -f /var/log/auth.log | awk '/sshd/ && /Accepted/{ fflush(); print "FOUND"}'

관련 정보