문제를 해결하기 위해 웹사이트에서 -f apache 액세스 로그를 추적해야 하는 경우가 많습니다. 한 가지 짜증나는 점은 한 번에 페이지를 로드하는 사람이 있으면 로그에 12줄 이상이 기록될 수 있다는 것입니다. 제 경우에는 각각 꽤 길기 때문입니다. 터미널의 줄.
tail -f는 grep 및 awk의 파이프와 잘 작동하는 것 같고 IP 주소가 특정 순간에 많은 요청을 할 때 중복을 필터링하는 매우 간단한 솔루션을 생각해 냈습니다(또한 내가 일반적으로 사용하는 특정 정보로 잘라냅니다). 필요) -
tail -f 로그 파일 | awk ' { print $1 " " $4 " " $9}' |
문제는 이것이 작동하지 않는다는 것입니다. 많은 수의 줄을 인쇄해야 한다는 것을 알고 있음에도 전혀 출력이 나오지 않습니다.
몇 가지 문제 해결을 시도했지만 실제로 작동하도록 할 수 없습니다.
tail -f log.file | awk ' { print $1 " " $4 " " $9}'
이것은 내가 생각한 대로 정확히 작동하고 다음과 같이 (그러나 중복이 많은) 줄을 인쇄합니다.
12.34.56.78 [10/May/2016:18:42:01 200
12.34.56.78 [10/May/2016:18:42:02 304
12.34.56.78 [10/May/2016:18:42:02 304
12.34.56.78 [10/May/2016:18:42:02 304
12.34.56.78 [10/May/2016:18:42:02 304
12.34.56.78 [10/May/2016:18:42:02 304
12.34.56.78 [10/May/2016:18:42:02 304
12.34.56.78 [10/May/2016:18:42:02 304
tail log.file | awk ' { print $1 " " $4 " " $9}' | uniq
이것은 또한 내가 생각한 대로 정확하게 작동하고 중복 행을 필터링합니다. 하지만 문제 해결을 위해서는 실시간 업데이트가 필요합니다.tail -f
tail -f
중복 행을 필터링하는 방법은 무엇입니까 ?
답변1
순수한 awk 솔루션으로 다음을 시도해 보십시오.
tail -f log.file | awk ' $0!=last{ print $1 " " $4 " " $9} {last=$0}'
이 명령은 입력 행이 이전 입력 행과 다른 경우에만 새 출력 행을 인쇄합니다.
약간의 변경으로 이 출력 라인은 이전 출력 라인과 다른 경우에만 새 출력 라인을 인쇄합니다.
tail -f log.file | awk '{$0=$1" "$4" "$9} last!=$0{print} {last=$0}'
예
이 테스트 파일을 사용해 보겠습니다.
$ cat logfile
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9 11
1 2 3 4 5 6 7 8 19
1 2 3 4 5 6 7 8 19 12
1 2 3 4 5 6 7 8 19 13
1 2 3 4 5 6 7 8 19
1 2 3 4 5 6 7 8 29
awk는 중복된 출력 라인을 필터링합니다.
$ cat logfile | awk '{$0=$1" "$4" "$9} last!=$0{print} {last=$0}'
1 4 9
1 4 19
1 4 29