AWK比较两个文件并打印具有IP地址的匹配列

AWK比较两个文件并打印具有IP地址的匹配列,awk,Awk,我不喜欢寻求帮助,而且在很大程度上我可以解决问题;然而,我无法理解我正在做的事情是错误的 有两个文件[出于明显原因进行了编辑]: 第一个文件;是要“查找”的IP列表 $OUT 1.1.1.1 2.2.2.2 111.111.111.111 第二文件;是用于扫描IP并获取ClientUID的日志文件 $file [0513.65] DevNet: Join succeeded: FoObAr playerid=0x0000000000000000 [0522.25] NetComeGo: C

我不喜欢寻求帮助,而且在很大程度上我可以解决问题;然而,我无法理解我正在做的事情是错误的

有两个文件[出于明显原因进行了编辑]:

第一个文件;是要“查找”的IP列表

$OUT

1.1.1.1
2.2.2.2
111.111.111.111


第二文件;是用于扫描IP并获取ClientUID的日志文件

$file

[0513.65] DevNet: Join succeeded: FoObAr playerid=0x0000000000000000
[0522.25] NetComeGo: Close IpNetDriverSteamworks_0 IpNetConnectionSteamworks_2 111.111.111.111:12345
[0522.25] DevOnline: EndRemoteClientAuthSession: ClientAddr: 111.111.111.111:12345, ClientUID: 00000000000000000
[0522.25] DevOnline: EndLocalServerAuthSession: ClientAddr: 111.111.111.111, ClientUID: 00000000000000000
[0522.25] DevOnline: EndLocalServerAuthSession: SessionUID: 4
所需输出:

ClientAddr: 111.111.111.111 ClientUID: 00000000000000000
#!/bin/bash

file=$1
OUT=/tmp/scanLog/data.tmp

awk --posix '$2 ~ /^NetComeGo/ && $5 ~ /^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}/ {a[$5]++}END{for(i in a)if(a[i] > 100){print i}}' $file >$OUT

awk --posix 'NR==FNR{a[NR]=$1;next}{for (i in a){if($4 ~ /^ClientAddr/ && $5 ~ /"^"a[i]/)print $4 $5 $6 $7}}' $OUT $file

rm $OUT

我试过这个:

awk--posix'NR==FNR{a[NR]=$1;next}{for(a中的i){if($4~/^ClientAddr/&&&&&$5~/“^”a[i]/)打印$4$5$6$7}'$OUT$文件

awk--posix'NR==FNR{a[$1];next}{for(a中的i){if($4~/^ClientAddr/&&&&$5~/“^”a[i]/)打印$4$5$6$7}}$$OUT$文件

但它不起作用;过去几天我一直在阅读和查找信息。。。。但我就是想不通我做错了什么。


完整bash脚本:

ClientAddr: 111.111.111.111 ClientUID: 00000000000000000
#!/bin/bash

file=$1
OUT=/tmp/scanLog/data.tmp

awk --posix '$2 ~ /^NetComeGo/ && $5 ~ /^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}/ {a[$5]++}END{for(i in a)if(a[i] > 100){print i}}' $file >$OUT

awk --posix 'NR==FNR{a[NR]=$1;next}{for (i in a){if($4 ~ /^ClientAddr/ && $5 ~ /"^"a[i]/)print $4 $5 $6 $7}}' $OUT $file

rm $OUT

我目前在心理健康方面有困难;我希望这一帮助请求是有道理的



假设您需要检查Input\u file2中的行,这些行的IP地址与Input\u file1+中的相同,而Input\u file1+中有
ClientUID
,并且该行中的IP地址后跟
:数字
,如果是这种情况,请尝试以下操作

awk '
FNR==NR{
  a[$0]
  next
}
/ClientUID:/ && match($0,/ClientAddr: [0-9]+\.[0-9]+\.[0-9]+\.[0-9]+:[0-9]+/){
  val=substr($0,RSTART+12,RLENGTH-12)
  sub(/:.*/,"",val)
  if(val in a){
    print "ClientAddr:",val,$(NF-1),$NF
  }
}
'  Input_file1  Input_file2
说明:添加上述内容的详细说明

awk '                                              ##Starting awk program from here.
FNR==NR{                                           ##Checking condition FNR==NR which will be TRUE when Input_file1 is being read.
  a[$0]                                            ##Creating array a with index current line here.
  next                                             ##next will skip all further statements from here.
}
/ClientUID:/ && match($0,/ClientAddr: [0-9]+\.[0-9]+\.[0-9]+\.[0-9]+:[0-9]+/){    ##Checking condition if ClientUID is present in line and ClientAddr with IP addrsss then colon digits are present in current line then do following.
  val=substr($0,RSTART+12,RLENGTH-12)              ##Creating variable val which has sub-string of current line
  sub(/:.*/,"",val)                                ##Substituting from colon to everything till last with NULL in val to get only IP address.
  if(val in a){                                    ##Checking if val is present in a then do following.
    print "ClientAddr:",val,$(NF-1),$NF            ##Printing string ClientAddrthen val then last 2 fields of line here as per shown samples.
  }
}
'  file1 file2                                     ##Mentioning Inpupt_file names here.

为什么期望的输出中只有一行?运行它时得到的输出是什么?在什么方面是不正确的?你有多喜欢在AWK中这样做?在Perl或Python中可能更简单。Perl也可以是一种替代方法。