0

我有两个文件,一个是包含 IP 和主机信息的“主列表”,另一个是动态填充 IP 和用户代理字符串。请参见下面的示例。

示例文件 1:

24.143.206.32   Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0)
66.39.66.63     Dalvik/1.6.0 (Linux; U; Android 4.2.1; Nexus 7 Build/JOP40D)

示例文件 2:

24.143.206.32 # New Host US,city,44.8824996948,-99.6440963745
66.39.66.63 # New Host US,city,44.8824996948,-99.6440963745
and on and on

我需要找到两个 AND 输出匹配与 BOTH 的尾随信息之间的 IP 匹配。

24.143.206.32 Browser: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0) LOCATION: New Host US,city,44.8824996948,-99.6440963745

66.39.66.63  Browser: Dalvik/1.6.0 (Linux; U; Android 4.2.1; Nexus 7 Build/JOP40D) LOCATION: New Host US,city,44.8824996948,-99.6440963745

目前我正在使用它进行 IP 匹配:

awk 'FNR==NR{ a[$1]=$0;next } ($1 in a)' file1 file2 > matchesfile

我一遍又一遍地尝试,只是无法获得我需要的所有信息。你能提供任何帮助还是这太复杂了?我不确定这个方向。

4

4 回答 4

1
awk '
FNR==NR{ a[$1]=$0; next }
$1 in a {
   sub(/[[:space:]]+/,"&Browser: ",a[$1])
   sub(/[^[:space:]]+[[:space:]]+#/,"LOCATION:")
   print a[$1], $0
}
' file1 file2 > matchesfile
于 2013-02-27T03:19:01.717 回答
1

这就是我的做法:

  • 对于每一行,存储第一个字段中的 IP 地址并将其从行中删除。
  • 对于第一个文件中的每一行,将浏览器详细信息存储在以 IP 地址为键的数组中。
  • 对于任何后续文件中的每一行,如果在数组中找到 IP 地址,则打印一个格式化字符串,其中包含 IP 地址、与之关联的浏览器以及该行上的任何其他内容。

例子:

% awk ' {
    IP = $1
    $1 = ""
}
FNR == NR {
    browser[IP] = $0
}
FNR != NR && IP in browser {
    printf "%s Browser:%s Location:%s\n", IP, browser[IP], $0
}
' file[12]
24.143.206.32 Browser: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0) Location: # New Host US,city,44.8824996948,-99.6440963745
66.39.66.63 Browser: Dalvik/1.6.0 (Linux; U; Android 4.2.1; Nexus 7 Build/JOP40D) Location: # New Host US,city,44.8824996948,-99.6440963745
于 2013-02-27T03:12:32.050 回答
1

如果您想要来自两个输出的数据,那么您需要打印信息,并进行稍微不同的测试,我认为:

awk 'FNR == NR { a[$1] = $0; next }
     { if ($1 in a) print $0 " " a[$1] }' file1 file2 > matchesfile

这与您所拥有的非常接近;不过印刷不一样。print $0您隐式调用。awk至少使用 GNU ,您可以使用条件作为模式:

awk 'FNR == NR { a[$1] = $0; next }
     ($1 in a) { print $0 " " a[$1] }' file1 file2 > matchesfile

如果您想将“浏览器:”和“位置:”标签添加到输出中,则需要更多的工作:

awk 'FNR == NR { for (i = 2; i < NF; i++) a[$1] = a[$i] " " $i; next }
     ($1 in a) { for (i = 2; i < NF; i++) loc = loc " " $i;
                 print $1 " Browser: " a[$1] " Location: " loc }
    ' file1 file2 > matchesfile

第一个for循环file1将 IP 地址之后的浏览器字段连接到a[$1]. 第二个for循环对来自file2into variable的位置信息执行相同的操作loc。然后print吐出数据。您可以微调格式以满足您的要求。

还有其他方法可以达到相同的结果......

于 2013-02-27T03:13:51.503 回答
0
awk 'FNR==NR{f=$1;$1=$2="";a[f]=$0;next}($1 in a ){$2="Browser: "$2;print $0,a[$1]}' file2 file1
于 2013-02-27T06:06:27.473 回答