0

シェルスクリプトを使用して、複数回繰り返して 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 アドレスが返され、それらが隣接していない行にある場合は、no. 反復の。その場合、uniq-c コマンドは機能しません。ソートオプションを使用するとソートされますが、URLごとに上記のように出力を表示する必要があります。カウントとその IP アドレスを含む URL と次の行。

たとえば。google.com で nslookup を実行すると、複数のアドレスが返され、uniq -c を実行すると、次の出力が得られます。ご覧のとおり、同じ IP アドレスがありますが、隣接していない行では uniq -c が機能しないため、カウントは 1 しかありません。

  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'

ありがとうございました。

4

3 に答える 3

2

次の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
于 2013-04-12T08:03:09.190 に答える
0

最初のコマンドを試してください。ただし、次を追加してくださいsort

awk '{print $1}' file.log | sort | uniq -c
于 2013-04-12T07:27:53.797 に答える
0

直接使用できます:

awk '{a[$1]++}END{for(i in a)print a[i],i}' file.log

複数のコマンドと各コマンドの出力をパイプする代わりに。

awkなしでそれが必要な場合:

cut -f1 -d"\t" file.log|sort|uniq-cしましょう

于 2013-04-12T07:39:58.887 に答える