从Apache / Nginx Access.log检索用户代理

时间:2019-06-10 11:27:51

标签: linux bash apache nginx ssh

我下面有一个命令,可以打印出匹配,主机IP(本地服务器/负载平衡器)和外部IP(导致匹配的一个),我也想在给出的信息旁边打印出用户代理信息。请问如何实现?

$var = file('q1.txt'); 
$abc = explode(' ', $var);

echo '<ul style=" list-style-type: circle;">';
foreach($abc as $value){
  echo " <li>$value</li>";
}
echo '</ul>';

我得到的是下面的...

命中,主机IP,外部IP

如果可能的话,我想要...

命中,IP(主机示例),外部IP(导致匹配),用户代理

cat access.log | sed -e 's/^\([[:digit:]\.]*\).*"\(.*\)"$/\1 \2/' | sort -n | uniq -c | sort -nr | head -20

下面是日志摘录

10000  192.168.1.1  148.285.xx.xx  Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.4 (KHTML, like Gecko) Chrome/98 Safari/537.4

1 个答案:

答案 0 :(得分:0)

如果GNU AWK(gawk)可用,请尝试以下操作:

awk -v FPAT='(\"[^"]+\")|(\\[[^]]+])|([^ ]+)' '
{ gsub("\"", "", $9); gsub("\"", "", $10); print $1 " " $10 " " $9 }
' access.log | sort -n | uniq -c | sort -nr | head -20
  • FPAT的值表示access.log中每个字段的正则表达式。即:“字符串用双引号引起来”,“字符串用方括号包围” 方括号”或“用空格分隔的字符串”。
  • 然后,您可以将access.log的每一行划分为以下字段:$1代表host IP$10代表external IP$9代表user agent