access.log에서 고유 필드를 추출하는 방법은 무엇입니까?

access.log에서 고유 필드를 추출하는 방법은 무엇입니까?

이것은 내가 분석하려는 대규모 access.log 파일의 일부입니다.

4.3.2.1 - - [22/Sep/2016:14:27:18 -0500]  "GET / HTTP/1.0" 301 184 "-" "WordPress/4.5.4; http://my.example.com; verifying pingback from 127.0.0.1"-
4.3.2.1 - - [22/Sep/2016:14:27:18 -0500] "GET / HTTP/1.0" 301 184 "-" "WordPress/4.5.4; http://my.example.com; verifying pingback from 127.0.0.1"
3.2.1.4 - - [22/Sep/2016:14:27:18 -0500]  "GET / HTTP/1.0" 301 184 "-" "WordPress/4.5; http://somedomain.com; verifying pingback from 1.2.3.4"-
3.2.1.4 - - [22/Sep/2016:14:27:18 -0500] "GET / HTTP/1.0" 301 184 "-" "WordPress/4.5; http://somedomain.com; verifying pingback from 1.2.3.4"
5.4.3.2 - - [22/Sep/2016:14:27:18 -0500]  "GET / HTTP/1.0" 301 184 "-" "WordPress/4.4.2; http://demo.otherdomain.com/blog; verifying pingback from 1.2.3.4"

파일에서 고유한 도메인을 추출하는 방법을 알고 싶습니다. 결과는 다음과 같습니다.

http://my.example.com
http://somedomain.com;
http://demo.otherdomain.com/blog;

답변1

이 경우 나는 주변을 둘러보기 위해 Perl의 grep을 사용하는 것을 정말 좋아합니다.

grep -oP '(?<=http://).*(?=;)' access.log | sort -u

아래와 같은 예를 사용하여 목록을 반환합니다.

$ grep -oP '(?<=http://).*(?=;)' access.log | sort -u
demo.otherdomain.com/blog
my.example.com
somedomain.com

답변2

 awk '{for(i=1;i<=NF;i++)if($i ~ /^http:\/\//)print $i}' access.log |sort -u

https당신도 분석하고 싶다면

awk '{for(i=1;i<=NF;i++)if($i ~ /^http(s)?:\/\//)print $i}' access.log |sort -u

tr다음을 사용하여 후행 세미콜론을 제거 할 수도 있습니다 .

awk '{for(i=1;i<=NF;i++)if($i ~ /^http(s)?:\/\//)print $i}' access.log |tr -d ';' |sort -u

답변3

awk '{ print $13 }' access.log | sort -u

기본적인 시도라고 생각합니다. awk는 공백을 구분 기호로 사용하여 각 줄의 13번째 필드를 선택하고 이를 정렬하도록 파이프하여 URL을 정렬하고 배수를 제거합니다( -uuniq의 경우).

특정 줄에만 정보가 포함되어 있거나 모두 이 형식이 아닌 경우 먼저 파일을 grep하여 적용할 줄을 선택해야 합니다.

관련 정보