이것은 내가 분석하려는 대규모 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을 정렬하고 배수를 제거합니다( -u
uniq의 경우).
특정 줄에만 정보가 포함되어 있거나 모두 이 형식이 아닌 경우 먼저 파일을 grep하여 적용할 줄을 선택해야 합니다.