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

标签 linux bash shell awk string-comparison

我有一个名为 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/

相关文章:

c - 在Linux(RedHat)中,C函数malloc_stats()与/proc/<pid>/stat常驻内存大小相比显示不同的值

linux - 在 CentOS 上更新 Apache Ant

linux - 使用shell脚本自动杀死进程

linux - 使用 sed/awk 将一行附加到另一行

linux - 如何将 bash 脚本的执行限制为特定用户

linux - 如何在 shell 脚本中交换单词?

linux - "-fstack-protector"和 "FORTIFY"选项有何不同?

linux - 如何从 POS 打印机获取状态

linux - 如何加快此 curl 脚本并更快地响应

linux - 如何按大小降序查找并显示包含 file1 的所有目录和子目录?