Grep 为IP地址刷新日志

Grep 为IP地址刷新日志,grep,Grep,我很不擅长使用“basic?”unix命令,这个问题让我的知识更难测试。我想做的是从日志(例如apache的access.log)中grep所有IP地址,并计算它们出现的频率。我可以用一个命令完成吗?或者我需要为此编写一个脚本吗?您可以执行以下操作(其中datafile是日志文件的名称) 编辑:错过了关于计算地址的部分,现在添加了您至少需要一条短管道 sed -e 's/\([0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+\).*$/\1/' -e t -e d access

我很不擅长使用“basic?”unix命令,这个问题让我的知识更难测试。我想做的是从日志(例如apache的access.log)中grep所有IP地址,并计算它们出现的频率。我可以用一个命令完成吗?或者我需要为此编写一个脚本吗?

您可以执行以下操作(其中datafile是日志文件的名称)


编辑:错过了关于计算地址的部分,现在添加了

您至少需要一条短管道

sed -e 's/\([0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+\).*$/\1/' -e t -e d access.log | sort | uniq -c
它将打印每个IP(但仅适用于ipv4),排序前缀为计数

我用apache2的access.log对它进行了测试(虽然它是可配置的,所以你需要检查一下),它对我起了作用。它假定IP地址是每条线路上的第一件事

sed收集IP地址(实际上它查找4组数字,中间有句点),并用它替换整行
-et
继续到下一行,如果它成功地进行了替换,
-ed
将删除该行(如果该行上没有IP地址)<代码>排序排序:)并且
uniq-c
对连续相同行的实例进行计数(因为我们已经对它们进行了排序,所以它们对应于总计数)。

使用sed:

$ sed 's/.*\(<regex_for_ip_address>\).*/\1/' <filename> | sort | uniq -c
$sed's/*\(\)./\1/'| sort | uniq-c

您可以在Inernet上搜索并找到ip地址可用的正则表达式,并将其替换为
。e、 下面是我几年前写的一个脚本。它从apache访问日志中过滤出地址。我刚刚试过运行Ubuntu11.10(oneiric)3.0.0-32-generic#51 UbuntuSMP Thu Mar 21 15:51:26 UTC 2013 i686 i686 i386 GNU/Linux 它很好用。使用Gvim或Vim读取生成的文件,该文件将被称为unique_visions,它将在一列中列出唯一的IP。关键在于grep使用的行。这些表达式用于提取ip地址号。仅限IPV4。您可能需要浏览并更新浏览器版本号。我为Slackware系统编写的另一个类似脚本如下:


这里给出的答案中没有一个对我有效,因此这里有一个有效的答案:

cat yourlogs.txt | grep-oE“\b([0-9]{1,3}\){3}[0-9]{1,3}\b”| sort | uniq-c | sort

它使用grep隔离所有ip。然后对它们进行排序、计数,然后再次对结果进行排序。

因为在IP地址中,3位数字然后一个点会重复3次,所以我们可以这样写:

cat filename | egrep -o "([[:digit:]]{1,3}\.){3}[[:digit:]]{1,3}"
                                      ^^^     ^       ^~~~~~~~   
                         Up_to_3_digits.     Repeat_thrice.   Last_section.
使用bash变量甚至更短:

PAT=[[:digit:]]{1,3}
cat filename | egrep -o "($PAT\.){3}$PAT" 

要在文件中只打印唯一的IP地址,请使用
sort--uniq

管道输出。正如Dave Tarsi指出的那样,这实际上可能会失败,它会捕获像浏览器版本这样的有效IP地址。你需要知道IP地址在哪一行(开始),并且只选择那些行。正如Dave Tarsi指出的那样,这实际上可能会失败,它会捕获像浏览器版本这样的东西,这些东西都是有效的IP地址。您需要知道IP地址在线路上的位置(开始),只选择那些行。这是失败的,因为EGRIP将打印包括时间戳在内的整个行,并且每一行都是唯一的,您需要单选出IP地址并删除其余的行(或者以其他方式考虑在检查唯一性时只考虑IP)。在unix stackexchange中查看我的答案:
cat access.log |egrep -o '[[:digit:]]{1,3}\.[[:digit:]]{1,3}\.[[:digit:]]{1,3}\.[[:digit:]]{1,3}' |uniq -c|sort
cat filename | egrep -o "([[:digit:]]{1,3}\.){3}[[:digit:]]{1,3}"
                                      ^^^     ^       ^~~~~~~~   
                         Up_to_3_digits.     Repeat_thrice.   Last_section.
PAT=[[:digit:]]{1,3}
cat filename | egrep -o "($PAT\.){3}$PAT"