지속적으로 로그를 추적하고, 모든 파일을 찾고(sed), 발견된 파일을 표시(cat)하는 방법

지속적으로 로그를 추적하고, 모든 파일을 찾고(sed), 발견된 파일을 표시(cat)하는 방법

지속적으로 tail -f로그하는 방법, 모든 파일을 찾아( sed) cat발견한 파일을 표시( ) 하는 방법

감사 로그의 샘플 데이터.

tail -f /var/log/httpd/modsec_audit.log | sed 's/[^\/]*/\./;s/].*$//g'

산출

./apache/20180508/20180508-1428/20180508-142802-WvH6QgoeANwAAMwsFZ4AAAAF
./apache/20180508/20180508-1428/20180508-142803-WvH6QgoeANwAAMwtFfcAAAAG
./apache/20180508/20180508-1428/20180508-142803-WvH6QwoeANwAAMwuFlUAAAAH
./apache/20180508/20180508-1513/20180508-151357-WvIFBQoeANwAAMwnE@4AAAAA
./apache/20180508/20180508-1513/20180508-151357-WvIFBQoeANwAAMwoFD8AAAAB
./apache/20180508/20180508-1516/20180508-151608-WvIFiAoeANwAAMz1FSwAAAAA
./apache/20180508/20180508-1516/20180508-151609-WvIFiQoeANwAAMz2FYIAAAAB
./apache/20180508/20180508-1516/20180508-151611-WvIFiwoeANwAAMz3FeEAAAAC
./apache/20180508/20180508-1516/20180508-151611-WvIFiwoeANwAAMz4Fj4AAAAD
./apache/20180508/20180508-2112/20180508-211205-WvJY9QoeANwAAM1MFCoAAAAA

에코 작업

echo "./apache/20180508/20180508-1428/20180508-142802-WvH6QgoeANwAAMwsFZ4AAAAF" | sed 's/[^\/]*/\./;s/].*$//g' | awk '{print $0}' | xargs cat

고양이와 함께 일하기

cat /var/log/httpd/modsec_audit.log | sed 's/[^\/]*/\./;s/].*$//g' | awk '{print $0}' | xargs cat

꼬리에는 적용되지 않습니다.

tail -f /var/log/httpd/modsec_audit.log | sed 's/[^\/]*/\./;s/].*$//g' | awk '{print $0}' | xargs cat

sed스크립트가 절대 종료 되지 않고 스크립트가 종료될 때까지 결과가 계속 캐시되기 때문에 테일링이 작동하지 않는 것 같습니다 .

이 작업을 지속적으로 수행할 수 있는 방법이 있습니까?

답변1

버퍼링이 방해가 되고 있습니다.

셸에서 a를 사용하면 while read line한 줄씩 읽어야 하며 대부분의 버퍼링 문제를 방지해야 합니다.

tail -f /var/log/httpd/modsec_audit.log | while read line; do
    echo "$line" | sed 's/[^\/]*/\./;s/].*$//g' | awk '{print $0}' | xargs cat
done

아마도 더 나은 방법을 사용하고 쉘(bash)을 사용하여 로그 줄의 파일 이름을 일치시킬 수 있지만:

tail -f /var/log/httpd/modsec_audit.log | while read line; do
    line=${line/*([^\/])/.}
    line=${line%]*}
    [[ -n "${line}" ]] && cat "${line}"
done

답변2

이 시도:

tail -f /var/log/httpd/modsec_audit.log | stdbuf -oL sed 's/[^\/]*/\./;s/].*$//g' | stdbuf -oL awk '{print $0}' | while IFS='' read -r file; do cat $file ; done

관련 정보