如何在使用uniq或awk的shell脚本中获取唯一IP地址和错误的计数?
我正在使用shell脚本对URL进行多次迭代的nslookup。我需要检查每个URL返回IP的次数 在输出文件中,输出存储为如何在使用uniq或awk的shell脚本中获取唯一IP地址和错误的计数?,awk,uniq,nslookup,Awk,Uniq,Nslookup,我正在使用shell脚本对URL进行多次迭代的nslookup。我需要检查每个URL返回IP的次数 在输出文件中,输出存储为 URL IP address 使用uniq-c命令,当相同的IP地址相邻时,我得到计数,但当相同的IP地址位于非相邻行时,我得不到计数 Command is cat file.log | awk '{print $1}' | uniq -c 下面是示例输出 1 url 3 72.51.46.230 现在,如果一个特定的URL返回了多个IP地址,并且它们位于非相邻
URL
IP address
使用uniq-c命令,当相同的IP地址相邻时,我得到计数,但当相同的IP地址位于非相邻行时,我得不到计数
Command is
cat file.log | awk '{print $1}' | uniq -c
下面是示例输出
1 url
3 72.51.46.230
现在,如果一个特定的URL返回了多个IP地址,并且它们位于非相邻的行上,因为我已经运行了多次迭代。在这种情况下,uniq-c命令将不起作用。如果我使用排序选项,它会进行排序,但我需要显示每个URL的输出,如上面所述,即URL和下一行的计数及其IP地址
例如,如果我在google.com上进行nslookup,它将返回多个地址,我进行uniq-c,我将得到以下输出。正如您看到的,有相同的IP地址,但计数只有1,因为uniq-c在非相邻线路上不工作
1 74.125.236.64
1 74.125.236.78
1 74.125.236.67
1 74.125.236.72
1 74.125.236.65
1 74.125.236.73
1 74.125.236.70
1 74.125.236.66
1 74.125.236.68
1 74.125.236.71
1 74.125.236.69
1 nslookup: can't resolv 'google.com'
1 nslookup: can't resolv 'google.com'
1 nslookup: can't resolv 'google.com'
1 nslookup: can't resolv 'google.com'
1 nslookup: can't resolv 'google.com'
1 nslookup: can't resolv 'google.com'
1 nslookup: can't resolv 'google.com'
1 74.125.236.70
1 74.125.236.66
1 74.125.236.68
1 74.125.236.71
1 74.125.236.69
我也尝试过使用AWK,但在这种情况下,输出的格式并不是我所需要的
Awk命令
awk '{a[$0]++}END{for (i in a) printf "%-2d -> %s \n", a[i], i}' file.log
你能提出一个更好的解决方案来实现这一点吗-
获取计数并以上述格式显示
所需的输出格式是
URL
Count IP address
示例输入文件
URL1
72.51.46.230
72.51.46.230
google.com
74.125.236.64
74.125.236.78
(null)
nslookup: can't resolv 'google.com'
nslookup: can't resolv 'google.com'
nslookup: can't resolv 'google.com'
nslookup: can't resolv 'google.com'
nslookup: can't resolv 'google.com'
所需的样本输出
URL1
2 72.51.46.230
google.com
1 74.125.236.64
1 74.125.236.78
1 null
5 nslookup: can't resolv 'google.com'
谢谢。尝试您的第一个命令,但添加
sort
:
awk '{print $1}' file.log | sort | uniq -c
您可以直接使用:
awk '{a[$1]++}END{for(i in a)print a[i],i}' file.log
而不是多个命令和管道每个命令的输出
如果您希望它不带awk:
cut-f1-d“\t”文件。log | sort | uniq-c
将执行以下awk
脚本执行此任务:
$1~/[a-z]+[.].*/{ # If line have a letter in must be a URL
for(i in ip) # Print all the counts and IPs (empty first time)
print ip[i],i
delete ip # Delete array for next set of IP's
print # Print the URL
next # Skip to next line
}
{
ip[$0]++ # If here line contains IP, increment the count per IP
}
END{ # Reached end of file need to print the last set of IPs
for(i in ip)
print ip[i],i
}
将其另存为script.awk
并按如下方式运行:
$ awk -f script.awk file
creativecommons.org
2 72.51.46.230
google.com
5 nslookup: can't resolv 'google.com'
1 (null)
1 74.125.236.64
1 74.125.236.78
不同的域/url能否指向文件中的相同ip地址?您最好提供一个示例输入…请提供一个具有代表性的示例输入文件。应如何处理
(null)
?在google.com
之后跳过了google
的所有IP计数?可以避免空值。不关心null。在上面的情况下,如果返回错误,而不是null,请说nslookup:can not resolv url,我如何处理该错误并在输出中计算错误计数?@Kent,不同的url将不会指向相同的IP地址。因为我在每个URL上运行相同数量的迭代,所以我得到了该URL的相同IP。我尝试过排序,但它也会对URL名称进行排序,因此我无法以我想要的格式显示输出。在上面,如果你看到URL creativecommons.org,我运行了3次迭代,我得到了计数。谢谢。这很好用。你能告诉我下一步和[a-z]做什么吗?@sudo-o你能帮我把输出中的错误也考虑进去吗?如上图所示,如果返回错误,请使用“nslookup:can not resolv url”代替null,并在下面打印错误计数url@sudo-o我已经修改了上面的输出文件,您可以在其中看到错误。我使用了以下命令awk'/[a-z]/{for(a中的I)print a[I],I;delete a;print;next}{a[$0]+}END{for(a中的I)print a[I],I}'file.log
但在这种情况下,IP计数是正常的,只显示错误计数。如果你有一个新问题,然后发布一个新问题,确保清楚地解释你的问题,给出一个示例输入和预期的示例输出。