圖形化日誌分析工具再強,也比不上原生命令列在無圖形介面、高併發、大檔案場景下的靈活度。本文提供兩套生產級腳本:即時過濾高亮顯示、高效逆序讀取近 N 天日誌,並附贈 RSS 訂閱者分析實戰管線。
檔案:tail_access_log,授權 chmod +x 後直接執行。
#!/bin/bash
# 依賴:tput, grep, sed, tail
deny="$(tput bold; tput setaf 1)" # 亮紅
high="$(tput bold; tput setaf 3)" # 亮黃
norm="$(tput sgr0)"
tail "$@" -s 0.1 -f access_log \
| grep -Ev --line-buffered -f agents_to_ignore -f files_to_ignore \
| sed -u 's/\(.*\) - \[[^]]*\]\(.*\)/\1\2/' \
| sed -u 's#\(.*\) "https://www\.\(google\.[^/]*\).*[?&_]q=\([^&"]*\)[^"]*"#\1 "\2 (\3)"#' \
| sed -u 's/ HTTP\/1.[01]//; s/.NET CLR [0-9.]*//g; s/Gecko\/[0-9]*//; s/rv:[0-9.]*//; s/Mozilla\/[0-9.]* //' \
| sed -u "s/^/ /; s/^ *\([ 0-9.]\{15,\}\) -/\1/" \
| sed -u "s/\(.\{$COLUMNS\}\).*/\1/" \
| sed -u "s/\([^\"]*\"[^\"]*\" 40[34] [0-9]* \"\)\([^\"]*\)\(\".*\)/\1$deny\2$norm\3/;t;
s/\([^\"]*\"[^\"]*\" [0-9 -]* \"\)\([^\"]*\)\(\".*\)/\1$high\2$norm\3/;t;"
-s 0.1 降低 CPU 佔用--line-buffered 保證即時輸出檔案:get_last_days,用法 ./get_last_days 7 access_log
#!/bin/sh
days=$1
log=$2
export LANG=C
export TZ=UTC0
last_log_date=$(tail -1 "$log" | sed 's#.*\[\([^:]*\):\([^ ]*\) .*#\1 \2#g' | tr '/' ' ')
yesterday=$(date --date="$last_log_date $days day ago" +"%d/%b/%Y:%H:%M")
yesterday=$(echo $yesterday | cut -b-16)
yesterday="${yesterday}[0-9]"
tac "$log" | sed "\#$yesterday#Q"
tac 逆序輸出(從檔尾讀取),避免 700 MB 大檔全讀sed ... Q 命中日期即退出,極速截取LANG=C 關閉多國語言處理,加速 3-5 倍#!/bin/sh
export LANG=C
feed="/feed/rss2.xml"
./get_last_days 7 access_log \
| grep -F "GET $feed" \
| grep -vE "pixelbeat.org.*(rv:|MSIE|AppleWebKit/|Konqueror|Opera)" \
| sed 's/\([0-9]*\.[0-9]*\)\.[0-9]*\.[0-9]* .*"\([^"]*\)"$/\1\t\2/' \
| sort -k2 -k1,1 \
| uniq -c \
| grep -vE " 1 .*(rv:|MSIE|AppleWebKit/|Konqueror|Opera)" \
| grep -vE -f agents_to_ignore \
| sed 's/\([^\t]\)\t.*Firefox.*/\1\tFirefox/;
s/\([^\t]\)\t.*MSIE 7.0.*/\1\tIE7/;
s/\([^\t]\)\t.*Opera.*/\1\tOpera/;
s/\([^\t]\)\t.*Akregator.*/\1\tAkregator/;
s/\([^\t]\)\t.*Thunderbird.*/\1\tThunderbird/;
s/\([^\t]\)\t.*Liferea.*/\1\tLiferea/;
s/\([^\t]\)\t.*Google Desktop.*/\1\tGoogle Desktop/;' \
| cut -d$'\t' -f2 \
| sort | uniq -c \
| sed 's/\(.*\)\(feedfetcher.html\)\(.*\)id=\([0-9]*\).*/\1\2.\4\3/' \
| sed 's/ *[0-9]* .*\(http[^;]*\).* \([0-9]*\) subscriber.*/ \2 \1/' \
| uniq -f1 \
| sort -k1,1n \
| sed "s/^/ /; s/ *\([ 0-9]\{7,\}\) \([^ ].*\)/\1 \2/" \
| sed "s/\(.\{80\}\).*/\1/"
1245 Google Feedfetcher (123 subscribers)
321 Firefox
198 Thunderbird
87 Liferea
agents_to_ignore:機器人 UA 清單(Googlebot, Bingbot 等)files_to_ignore:靜態資源路徑命令列日誌分析三板斧:
tail -f看當下、tac | sed Q切歷史、管線組合掘金。無圖形介面也能做到極致。