Bash 스크립트는 Apache 로그를 분석합니다.

Bash 스크립트는 Apache 로그를 분석합니다.

이 스크립트에 대한 도움이 필요합니다. 이 스크립트는 filter.txt를 통해 apache_access.log를 분석합니다. 필터에 해당 용어가 있으면 스크립트가 작업을 수행합니다. 제 생각에 문제는 "for"라는 첫 번째 명령에 있는 것 같습니다. 필터를 한 줄씩 사용할 수 없습니다.

누군가 나를 도와줄 수 있나요?

for term  in `tail -n $LINESTOSEARCH $IPEATERFILTER`
do
    for ip in `tail -n $LINESTOSEARCH $LOGFILE | grep "$TERM" | awk "{print \\$1}" | sort | uniq -c | sort -rn | head -20 | awk "{if (\\$1 > $THRESHOLD) print \\$2}"`
    do
        # Look in iptables to see if this IP is already banned
        if ! iptables -L INPUT -n | grep -q $ip
        then



     # Do something



 fi

    done
done

답변1

다음 줄을 읽고 싶지 않습니다.for. 대신 while및를 사용하세요 read. 문제는 쉘이 공백으로 인수를 분할하므로 로그 파일 줄의 공백으로 인해 실제로 루프가 다른 시간에 실행된다는 것입니다.

tail -n $LINESTOSEARCH $IPEATERFILTER | while read -r line; do
    # do something with "$line"
done

내부 루프에 대해 동일한 패턴을 반복합니다.

관련 정보