오류 코드에 대해 Apache 로그를 검색해야 하며 오류 코드가 발견되면 해당 줄의 IP 주소만 표시합니까? Linux 명령을 사용하십시오.
답변1
이 질문은 찾고 있는 "코드"가 무엇인지, 해당 줄에 IP 주소가 어디에 있는지, 해당 코드가 포함된 줄이 어디에 있는지 등의 자세한 내용이 없으면 대답하기 어렵습니다.언제나동일한 회선에 하나의 IP 주소가 있습니까, 때로는 여러 개의 IP 주소가 있습니까, IP 주소가 모두 필요한가요? 등이 있습니다. IPv6 주소를 허용해야 합니까, 아니면 IPv4 주소만 허용해야 합니까?
IPv4 또는 IPv6와 일치해야 하는 경우 답변을 조정하세요.여기stackoverflow에서는 다음과 같은 것을 사용할 수 있습니다.
grep -E '[PATTERN]' access.log | grep -E -o -e '((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])' -e '(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))'
"[PATTERN]"을 검색해야 하는 정규식으로 바꾸세요.
여기 플래그는 -E
정규식을 확장하는 데 사용되므로 작업이 더 쉬워집니다. grep의 첫 번째 인스턴스는 로그를 "[PATTERN]"이 포함된 줄로 필터링합니다. grep의 두 번째 인스턴스는 IP 주소를 찾고 -o
해당 형식과 일치하는 행 부분만 출력하는 데 사용됩니다. 첫 번째 -e
표현식은 IPv4용이고 두 번째 -e
표현식은 IPv6용입니다.
IPv6의 정규식은 괴물입니다.
아마도 하나의 grep 인스턴스로 단순화할 수 있지만 로그 형식에 대한 자세한 내용이 필요합니다(또는 적어도 그럴 것입니다).