0

我有一个有效的 bash 脚本,当它们进入时告诉我 nginx 访问日志,将原始日志格式化为丰富多彩的信息。

不幸的是,我不太确定如何获取我已经创建的内容,并添加显示请求的用户代理。我希望能够一目了然地使用了哪个 User-Agent。是谷歌机器人吗?是 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

正如我在评论中所说,请注意字段内的空格,因为 awk 使用空格作为默认分隔符,您可能无法获得所需的正确字段。您可以使用 -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 回答
0

我前段时间解决了自己的问题,但忘记在这里更新。

以下是我想出的脚本:

#!/bin/sh

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

if [ "$LOG_PATH" = "" ] && [ -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

  sudo tail -n 500 ./nginx-access.log | perl -n -e'/^(\S+) (\S+) (\S+) (\S+) \[([^:]+):(\d+:\d+:\d+) ([^\]]+)\] \"(\S+) (.*?) (\S+)\" (\S+) (\S+) "([^"]*)" "([^"]*)"$/ && print "\033[40;1;35m[$5 $6]\033[0;32m $1 \033[37m$11 $8 \033[31m$9 \033[36m$2 \033[30;1m$14\033[0m\n"'

fi

本质上,脚本的主要部分或大部分是perl底部的命令。它使用正则表达式分离出日志格式,然后使用print.

$14用户代理最后使用来自正则表达式的粗体灰色文本显示。

如果其他人需要,可以给出进一步的解释。

于 2015-01-12T20:37:11.087 回答