AWK Сравните два файла и распечатайте соответствующие столбцы с IP-адресами - PullRequest
1 голос
/ 16 июня 2020

Я не люблю просить о помощи, и по большей части могу во всем разобраться; однако я не могу понять, что я делаю неправильно.

Есть два файла [отредактированы по понятным причинам]:

Первый файл; Список 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

Я пробовал это:

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

также

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

Но это не работает; Я провел последние несколько дней за чтением и поиском информации ... но я просто не могу понять, что я сделал не так. Полный bash сценарий:

#!/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

В настоящее время у меня проблемы с психическим здоровьем; Надеюсь, эта просьба о помощи имеет смысл.


1 Ответ

1 голос
/ 16 июня 2020

Предполагая, что вам нужно проверить строки в Input_file2, которые имеют тот же IP-адрес, что и в Input_file1 +, который имеет ClientUID в строке, а за IP-адресом следует :digits в этой строке, если это так, не могли бы вы попробовать следующее.

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.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...