Chociaż wszystkie powyższe narzędzia są fajne, myślę, że wiem, o co pytał pytający. Często boli mnie, że nie mogę wyciągnąć informacji z dziennika dostępu w sposób, w jaki mogę to zrobić z innymi plikami.
Wynika to z głupiego formatu dziennika dostępu:
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"
Dlaczego użyli [] do daty i „” do innych celów? czy myśleli, że nie wiedzielibyśmy, że data jest w polu 4? To niezwykle frustrujące.
Obecnie najlepszym narzędziem do tego jest gawk:
gawk 'BEGIN { FPAT="([^ ]+)|(\"[^\"]+\")|(\\[[^\\]]+\\])" } { print $5 }'
na powyższych danych dałoby to:
"GET /manual/elisp/index.html HTTP/1.1"
Innymi słowy, FPAT daje możliwość wyciągnięcia pól dziennika apache, tak jakby były rzeczywistymi polami, a nie tylko jednostkami oddzielonymi spacjami. Tego zawsze chcę. Następnie mogę to jeszcze bardziej przeanalizować za pomocą potoku.
Tworzenie FSPAT jest zdefiniowane tutaj: http://www.gnu.org/software/gawk/manual/html_node/Splitting-By-Content.html
Możesz więc ustawić alias, aby utworzyć gawk, który może analizować dzienniki Apache:
alias apacheawk="gawk -vFPAT='([^ ]+)|(\"[^\"]+\")|(\\\\[[^\\\\]]+\\\\])' "
apacheawk '$6 ~ /200/ { print $5 } | sort | uniq
zrobił to dla mnie:
"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"
i oczywiście prawie wszystko inne jest teraz możliwe.
Cieszyć się!