gpt4 book ai didi

Linux Shell 脚本 : How to compare a specific field in a text document with specific text in an if statement

转载 作者:IT王子 更新时间:2023-10-29 01:07:24 24 4
gpt4 key购买 nike

我有一个名为 transfer.log 的文件,其中包含一些 Apache 日志。我需要计算每个 IP 地址记录了多少 GET 请求。我知道如何访问文件并循环遍历文件中的行,但我无法将每行中的第 6 个字段与“GET”进行比较。

#!/bin/bash    

while read p;
do
name=( $(awk '{print $6}' p))
echo $name
if [ "$name" == "GET" ]
then
echo "yes"
else
echo "no"
fi
done < transfer.log

目前,当我运行脚本时,“no”被打印了 5 次,并且我收到一条错误消息,指出 awk 无法打开文件“p”。当我在变量声明中将 p 更改为 transfer.log 时,我可以获得 echo $name 以输出“GET(带引号)”,但它显然永远不会改变,因为它正在访问整个文件而不是新行 p。

我需要知道每次执行 while 循环时如何将 p 的第 6 列分配给我的变量名。另外,我很困惑为什么我的循环只迭代 5 次而不是 6 次。

我的 transfer.log 看起来像这样:

140.211.167.27 - - [15/Oct/2012:23:11:38 +0000] "GET / HTTP/1.1" 200 2963 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.4 (KHTML, like Gecko) Chrome/22.0.1229.94 Safari/537.4"
140.211.167.27 - - [15/Oct/2012:23:11:46 +0000] "GET /systems/ganeti/index HTTP/1.1" 200 5918 "https://wiki.osuosl.org/systems/index" "Mozilla/5.0(X11; Linux x86_64) AppleWebKit/537.4 (KHTML, like Gecko) Chrome/22.0.1229.94 Safari/537.4"
140.211.167.9 - - [15/Oct/2012:23:17:33 +0000] "GET /resources/index HTTP/1.1" 200 3411 "https://wiki.osuosl.org/index" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:15.0) Gecko/20100101 Firefox/15.0.1"
140.211.167.25 - - [15/Oct/2012:16:02:07 +0000] "GET /index HTTP/1.1" 200 2673 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:15.0) Gecko/20100101 Firefox/15.0.1"
66.249.74.101 - - [15/Oct/2012:02:20:14 +0000] "GET /robots.txt HTTP/1.1" 404 2458 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
128.193.164.34 - - [15/Oct/2012:12:41:18 +0000] "POST /rpc/xmlrpc HTTP/1.0" 200 8328 "-" "PHP XMLRPC 1.0"

最后,我需要计算每个特定 IP 地址记录了多少 GET 请求,并按照从最少到最多的 GET 请求对地址进行排序。

最佳答案

您可以使用以下 awk 命令来完成此操作:

$ awk '{if($6=="\"GET")ip[$1]++; else ip[$1]+=0}END{for(elem in ip){print elem, ip[elem]}}' input.log | sort -k2nr
140.211.167.27 2
140.211.167.25 1
140.211.167.9 1
66.249.74.101 1
128.193.164.34 0

解释:

  • {if($6=="\"GET")ip[$1]++; else ip[$1]+=0} 在文件的每一行上,它将检查第 6 个字段如果它等于 "GET 它将递增一个索引为 ip 的数组;如果第 6 个字段不等于 "GET,它会将 0 添加到数组中,以便考虑到已经完成一些 POST 的 ip 你可以删除这个逻辑,如果你没有识别它。
  • 然后在文件末尾打印每个ip加上GET的数量
  • 所有内容都通过管道传输到 sort 命令,该命令将使用第二个字段对输出进行排序,并以相反的数字顺序排序

关于Linux Shell 脚本 : How to compare a specific field in a text document with specific text in an if statement,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49166365/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com