Trong khi các công cụ trên đều tuyệt vời, tôi nghĩ tôi biết những gì người hỏi đang hỏi. Tôi thường đau đớn rằng tôi không thể lấy thông tin ra khỏi nhật ký truy cập theo cách tôi có thể với các tệp khác.
Đó là do định dạng nhật ký truy cập ngu ngốc:
127.0.0.1 - - [16/Aug/2014:20:47:29 +0100] "GET /manual/elisp/index.html HTTP/1.1" 200 37230 "http://testlocalhost/" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:31.0) Gecko/20100101 Firefox/31.0"
Tại sao họ sử dụng [] cho ngày và "" cho những thứ khác? họ có nghĩ rằng chúng ta sẽ không biết một ngày ở trường 4 không? Thật là bực bội vô cùng.
Công cụ tốt nhất hiện nay cho việc này là gawk:
gawk 'BEGIN { FPAT="([^ ]+)|(\"[^\"]+\")|(\\[[^\\]]+\\])" } { print $5 }'
trên dữ liệu trên đây sẽ cung cấp cho bạn:
"GET /manual/elisp/index.html HTTP/1.1"
Nói cách khác, FPAT cung cấp cho bạn khả năng lấy ra các trường của nhật ký apache như thể chúng là các trường thực tế thay vì chỉ các thực thể được phân tách bằng dấu cách. Đây luôn là những gì tôi muốn. Sau đó tôi có thể phân tích thêm một chút với một đường ống.
Làm cho công việc FSPAT được xác định tại đây: http://www.gnu.org/software/gawk/manual/html_node/Splmit-By-Content.html
Do đó, bạn có thể thiết lập một bí danh để tạo ra một chú chim ưng có thể phân tích nhật ký apache:
alias apacheawk="gawk -vFPAT='([^ ]+)|(\"[^\"]+\")|(\\\\[[^\\\\]]+\\\\])' "
apacheawk '$6 ~ /200/ { print $5 } | sort | uniq
làm điều này cho tôi:
"GET / HTTP/1.1"
"GET /manual/elisp/index.html HTTP/1.1"
"GET /manual/elisp/Index.html HTTP/1.1"
"GET /scripts/app.js HTTP/1.1"
"GET /style.css HTTP/1.1"
và tất nhiên gần như mọi thứ khác đều có thể.
Thưởng thức!