AWK比较两个文件并打印具有IP地址的匹配列
我不喜欢寻求帮助,而且在很大程度上我可以解决问题;然而,我无法理解我正在做的事情是错误的 有两个文件[出于明显原因进行了编辑]: 第一个文件;是要“查找”的IP列表 $OUTAWK比较两个文件并打印具有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
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也可以是一种替代方法。