bash - 在对 Apache 服务器日志进行排序时排除某些机器人
问题描述
我有一个 bash 脚本,它对我的服务器日志中的最高命中进行排序,并打印 IP 地址和用户代理:
cat /var/log/apache2/proxy.example.com.access.log | awk -F'|' '{print $5 $11}' | sort -n | uniq -c | sort -nr | head -30
它打印出这样的结果:
COUNT IP Address User Agent
37586 66.249.73.223 "Mozilla/5.0 (Linux; Android 6.0.1; Nexus 5X Build/MMB29P) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.96 Mobile Safari/537.36 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
23960 84.132.153.226 "-" <--- I do need to see things like this
13246 17.58.103.219 "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/600.2.5 (KHTML, like Gecko) Version/8.0.2 Safari/600.2.5 (Applebot/0.1; +http://www.apple.com/go/applebot)" <--- But not this
10572 66.249.90.191 "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36 Edge/12.246 Mozilla/5.0"
9505 66.249.73.223 "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
5157 66.249.73.193 "Mozilla/5.0 (Linux; Android 6.0.1; Nexus 5X Build/MMB29P) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.96 Mobile Safari/537.36 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
我不关心 Googlebot、Bingbot、Applebot 等机器人。有没有办法让我获得相同的格式,但不包括这些友好的机器人?
我可以通过以下方式排除 Googlebot:
cat /var/log/apache2/proxy.example.com.access.log | awk -F'|' '{print $5 $11}' | grep -v "Googlebot" | sort -n | uniq -c | sort -nr | head -30
但我想排除多个机器人。
我也做了:
cat /var/log/apache2/proxy.example.com.access.log | awk -F'|' '{print $5 $11}' | grep -v "Googlebot" | grep -v "bingbot" | grep -v "Applebot" | sort -n | uniq -c | sort -nr | head -30
这似乎可行,但是管道几个grep的正确bash语法是什么?
解决方案
我找到了一种更简洁的方法来代替多个“grep -v”。我使用了 egrep:
cat /var/log/apache2/proxy.example.com.access.log | awk -F'|' '{print $5 $11}' | egrep -v "Googlebot|bingbot|Applebot" | sort -n | uniq -c | sort -nr | head -30
除非有人有更好的方法,否则这对我来说非常有效。
推荐阅读
- typescript - javascript set.has() 不是函数
- python - 无法从 python shell 运行 celery 任务
- php - 如何最好地使用 mb_convert_case 和像 o'hare 这样的字符串来实现 ucwords($str," '-")?
- ios - 当应用于 WKWebView 中的视频 srcObject 时,有什么方法可以防止 getUserMedia“直播”?
- python - 列表包含 Python 中的列表
- acumatica - 为什么这个字段没有被添加到 SOLine 表中
- javascript - 无法读取未定义的属性。但是属性是导入类的静态函数
- c# - C# 不应该接受具有名字和姓氏的重复 ID
- javascript - 如何使用 JavaScript 将句子的第一个字符大写?
- reactjs - 点击后反应失去选择的焦点