如何在使用uniq或awk的shell脚本中获取唯一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地址,并且它们位于非相邻

我正在使用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地址,并且它们位于非相邻的行上,因为我已经运行了多次迭代。在这种情况下,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计数是正常的,只显示错误计数。如果你有一个新问题,然后发布一个新问题,确保清楚地解释你的问题,给出一个示例输入和预期的示例输出。