0

nginx のアクセス ログが入ってくるとそれを通知し、生のログをカラフルな情報にフォーマットする、有効な bash スクリプトがあります。

残念ながら、既に作成したものを取得して、リクエストの User-Agent を表示する方法がよくわかりません。どの User-Agent が使われたか一目でわかるようにしたい。Googlebot でしたか?WindowsのFirefox 22でしたか?

私が持っているbashスクリプトは次のとおりです。

#!/bin/bash

LOG_DEFAULT_PATH="/var/log/nginx/access.log"
LOG_PATH="$1"

if [ "$LOG_PATH" = "" ] && test -f "$LOG_DEFAULT_PATH"; then

  echo -e "\033[35mAuto-detected Log File: \033[32m$LOG_DEFAULT_PATH\033[0m"
  LOG_PATH="$LOG_DEFAULT_PATH"

fi

if [ "$LOG_PATH" = "" ]; then

  echo -e "\033[32mUsage: $0 /path/to/nginx/access_log\033[0m"

else

  (tail -n 500 -F $LOG_PATH | awk '{printf "%s%s %s %s%s%s %s %s %s%s%s %s%s\n", "\033[40;1;35m", $5, $6, "\033[0;32m", $1, "\033[37m", $10, substr($7, 2), "\033[31m", $8, "\033[36m", $2, "\033[0m"}')

fi

スクリプトの本体は、tail コマンドで始まる行にあります。awk を使用して、リクエストのさまざまな部分を端末に出力し、各部分に色を付けています。ここで、User-Agent 情報も表示されると思います。

ログ形式は次のとおりです。

  log_format  vhost_combined  '$http_host $remote_addr - $remote_user [$time_local]  '
                              '"$request" $status $body_bytes_sent "$http_referer" '
                              '"$http_user_agent"';

もちろん、より良いスクリプトに関する提案も大歓迎です!

4

2 に答える 2

1

コメントで述べたように、フィールド内の空白に注意してください。空白をデフォルトのセパレータとして使用すると、必要な正しいフィールドが得られない可能性があるためです。-F オプションを使用してデフォルトのセパレータを変更するか、awk で正規表現を使用してこれを行うことができます。awk での正規表現の例:

awk '{if(match($0,/GET ([^ ]*)/,a)){print a[1];}}' access_log

参照できる正規表現は次のようになります。

^(\d+\.\d+\.\d+\.\d+) ([^ ]+) ([^ ]+) \[([^\]]*)\] \"([A-Z]+) ([^\"]+)\" (\d+) (\d+) \"([^\"]*)\" \"([^\"]*)\" \"([^\"]*)\" ([\d\.]+)( (\d+) (\d+))?

結果: ここに画像の説明を入力

画像がはっきりと見えない場合は、右クリックして別のタブで再度開き、元のサイズを表示してください。

于 2013-07-29T03:45:16.650 に答える