따라서 access_log라는 액세스 로그 항목 파일이 있고 웹 서버에서 액세스한 모든 고유 파일을 찾아야 합니다. access_log의 형식은 다음과 같습니다. 이는 단지 발췌일 뿐입니다.
66.249.75.4 - - [14/Dec/2015:08:25:18 -0600] "GET /robots.txt HTTP/1.1" 404 1012 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
66.249.75.4 - - [14/Dec/2015:08:25:18 -0600] "GET /~robert/class2.cgi HTTP/1.1" 404 1012 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
66.249.75.4 - - [14/Dec/2015:08:30:19 -0600] "GET /~robert/class3.cgi HTTP/1.1" 404 1012 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
202.46.61.93 - - [14/Dec/2015:09:07:34 -0600] "GET / HTTP/1.1" 200 5208 "-" "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)"
이러한 파일(예: 첫 번째 "robots.txt")은 GET, HEAD 또는 POST 단어 뒤에 위치합니다. "를 구분 기호로 사용하여 cut 명령을 사용해 보았지만 작동하지 않았습니다. 비교할 수 있도록 파일에서 필드를 구분하는 방법을 실제로 모릅니다. 누군가 나를 지적할 수 있다면 방향이 맞았으면 정말 좋겠습니다. 정말 감사드립니다.
편집: 알아냈습니다. @MichaelHomer님 말이 맞습니다. 내 구문이 잘못되었으므로 cut이 작동하지 않습니다. 나는 공간을 구분 기호로 사용했고 효과가 있었습니다.
답변1
다음은 귀하가 제공한 예시의 연습입니다.
awk
지정할 수 있는 열과 행을 인쇄합니다. man
더 많은 참고 자료를 보려면 이 페이지와 Google을 확인하는 것이 좋습니다 . 귀하의 경우 구분 기호는 각 열을 구분하는 공백입니다. 지금까지 제공한 내용에 따라 각 행에 서로 다른 텍스트가 포함되어 열의 위치가 달라지기 때문에 달라질 수 있지만 처음 세 행의 경우 다음과 같이 시작할 수 있습니다.
cat access_log | awk 'NR==1,NR==3 {print $7}' | sort -u
NR==1,NR==3
1~3행을 인쇄하세요.
{print $7}
필요한 파일 이름인 일곱 번째 열을 인쇄합니다. 각 행의 텍스트가 다를 수 있으므로 항상 일곱 번째 열이 되는 것은 아닙니다.
sort -u
고유한 값을 출력
출력은 다음과 같습니다
/robots.txt
/~robert/class2.cgi
/~robert/class3.cgi
마지막 부분은 sort
중복이 없기 때문에 예제에 아무런 차이가 없지만, 파일의 나머지 부분이 그렇다면 해당 특정 열의 고유 값만 인쇄합니다.
파일 이름만 인쇄하려면 다음 명령에 매개변수를 사용할 수 있습니다 substr
.awk
cat access_log | awk 'NR==1 {print substr($7,2,10)} NR==2,NR==3 {print substr($7,10,10)}'
출력은 다음과 같습니다:
robots.txt
class2.cgi
class3.cgi
설명하다:
NR==1 {print substr($7,2,10)}
필드 7의 첫 번째 줄의 경우 위치 2에서 시작하여 10자가 인쇄됩니다.
NR==2,NR==3 {print substr($7,10,10)}
필드 7의 두 번째부터 세 번째 줄은 10번째 위치에서 시작하여 10개의 문자가 인쇄됩니다.
파일의 나머지 부분은 다를 수 있고 항상 같은 위치에 정렬되지는 않으므로 열과 값을 수정해야 할 수도 있지만 이렇게 하면 시작됩니다. 시간이 많이 걸리는 것처럼 보일 수도 있지만 조사를 하면 올바른 방향으로 갈 수 있습니다.
답변2
각 고유 파일 적중 횟수를 제공하는 또 다른 접근 방식은 다음과 같습니다.
awk '{print $7}' access_log | sort | uniq -c | sort -rn
또는 특정 날짜를 클릭하려면 먼저 날짜를 grep할 수 있습니다.
fgrep "14/Dec/2015" access_log | awk '{print $7}' | sort | uniq -c | sort -rn
다소 관련이 있는 경우 위의 방법을 사용하여 인쇄물을 $7에서 $1로 변경하여 사이트의 고유 방문자(적어도 고유 IP)를 찾을 수 있습니다. 내 사이트가 DoS 공격을 당하면 개인적으로 동일한 명령을 사용하여 차단하려는 네트워크의 IP를 찾습니다.