나는 지난 1 년 동안 모든 Apache 로그를보고 특정 PHP 페이지 (foobar.php)가 외부 IP 주소에서 방문되었는지 확인해야합니다.Linux 서버에서 "find"를 사용하여 리눅스 서버에서
그래서 모든 LAN IP (192.168.x.x)에서 방문을 제외하고 foobar.php가 포함 된 Apache .log 및 log.gz 파일의 모든 행을 찾아야합니다.
grep 명령을 사용하여 찾을 수 있습니까?
나는 지난 1 년 동안 모든 Apache 로그를보고 특정 PHP 페이지 (foobar.php)가 외부 IP 주소에서 방문되었는지 확인해야합니다.Linux 서버에서 "find"를 사용하여 리눅스 서버에서
그래서 모든 LAN IP (192.168.x.x)에서 방문을 제외하고 foobar.php가 포함 된 Apache .log 및 log.gz 파일의 모든 행을 찾아야합니다.
grep 명령을 사용하여 찾을 수 있습니까?
: @EdMorton이 코멘트에 지적한 바와 같이, awk
우리가 사용하는 더 나은 도구가 될 수있다 작동합니다 :이 같은
zgrep -v '^192\.168\.' access.log* | grep '/foobar\.php'
처음에는 부정적인 grep을하는 것이 흥미 롭다. 나는 직관적 인 일이 foobar에 대한 grep 일 것이라고 생각했을 것이다. 그리고 나서 다른 방법보다는 그 ip에 관한 줄을 제거 할 것이다. 50 개가 foobar를 포함하고 있고 50 개가 foobar를 포함하고 50 개가 포함 된 일부 교차 하위 집합과 함께 IP를 포함하는 파일이 주어지면 첫 번째 grep은 1000 개의 행을 검색하고 두 번째는 950 개를 검색 (즉 1950 개의 행이 검색 됨)되는 반면 당신이 그것을 반대로한다면 두 번째 grep은 50 개의 라인 (즉, 총 1050 개의 라인을 검색)을 통해서만 검색합니다. –
@EdMorton 이렇게하면,'^ 192 \ .168 \ .'을 줄의 시작 부분에 매치시킬 수 있습니다. 다른 방법으로는'access.log.3.gz'만큼 간단하지 않을 수도있는 파일 이름 (첫 번째 'grep'에 의해 생성 됨)을 건너 뛰게됩니다. _shrug_ –
이 두 명령은 모든 압축 및 압축 아파치 액세스 로그에 /mypage.php
를 검색해야합니다
grep '/mypage\.php' access.log access.log.[0-9] | grep -v '192\.168\.[0-9.]\+'
zcat access.log*.gz | grep '/mypage\.php' | grep -v '192\.168\.[0-9.]\+'
grep -v
는 192\.168\.[0-9.]*
의 정규식 일치를 부정한다. zcat
은 gzip 압축 파일의 경우 cat
과 같습니다.
편집 : 당신의 로그를 공통 로그 형식 (CLF), 이런 일에 가정
awk '/\/mypage\.php/ && !/192\.168\.[0-9.]+/' access.log access.log.[0-9]
zcat access.log*.gz | awk '/\/mypage\.php/ && !/192\.168\.[0-9.]+/'
좋은 점; 편집에서 이것을 추가했습니다. 감사! :) 예, 저는'+'을 의미했습니다. – Will
대단히 감사합니다.이 두 가지가 마음에 들지만, 첫 번째 대답은 받아 들였습니다. 고맙습니다. – user164863
굉장합니다, 문제 없습니다. 나는 당신이 더 잘 받아 들인 대답을 좋아합니다. 나는 zgrep이 non-gzipped 파일에서 작동한다는 것을 깨닫지 못했습니다! – Will
뭔가를 (안된) 수행해야합니다
find dir_where_logs_are -type f \(-name '*.log' -o -name '*.log.gz' \) -print |
while IFS= read -r file
do
case $file in
*.gz) zgrep 'mypage\.php' "$file" ;;
*) grep 'mypage\.php' "$file" ;;
esac
done |
grep -E -v '192\.168\.[0-9]+\.[0-9]+'
위의 내용은 파일 이름에 줄 바꿈이 없다고 가정합니다.
당신의 생각에 대해 대단히 감사합니다. 나는이 두 가지를 좋아합니다.하지만 첫 번째 대답은 받아 들였습니다. 고맙습니다. – user164863
지금까지 사용해 보신 것은 무엇입니까? –
그리 많지는 않지만 검색된 줄은 두 줄 바꿈 사이에 있어야하며 foobar.php를 포함하고 로컬 주소를 포함하지 않아야한다는 것을 이해합니다. find -type f -exec grep -regex "[\/\? n \\ n (? =. * foobar \ .php *) (?!. * 192 \ .168 \. *) \/r \/n] " – user164863
로그 파일의 일부 줄을 추가하면 더 좋을 것입니다. 질문에. – Shafizadeh