Хобрук: Ваш путь к мастерству в программировании

AWK Сравните два файла и распечатайте совпадающие столбцы с IP-адресами

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

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

Первый файл; Список IP-адресов для «поиска».

$OUT

1.1.1.1
2.2.2.2
111.111.111.111



Второй файл; Это файл журнала для сканирования IP-адресов и получения ClientUID.

$файл

[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

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


awk
16.06.2020

  • Почему в желаемом выводе только одна строка? 16.06.2020
  • Какой результат вы получаете, когда запускаете его? В чем неправильный? 16.06.2020
  • Насколько вы привязаны к тому, чтобы делать это в AWK? Это может быть проще в Perl или Python. 16.06.2020
  • Альтернативой может быть Perl. 20.06.2020

Ответы:


1

Предполагая, что вам нужно проверить строки в 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.
16.06.2020
Новые материалы

Декларативное и функциональное программирование в стиле LINQ с использованием JavaScript с использованием каррирования и генератора ...
LINQ - одна из лучших функций C #, которая обеспечивает элегантный способ написания кода декларативного и функционального стиля, который легко читать и понимать. Благодаря таким функциям ES6,..

Структуры данных в C ++ - Часть 1
Реализация общих структур данных в C ++ C ++ - это расширение языка программирования C, которое поддерживает создание классов, поэтому оно известно как C с классами . Он используется для..

Как я опубликовал свое первое приложение в App Store в 13 лет
Как все началось Все началось три года назад летом после моего четвертого класса в начальной школе. Для меня, четвертого класса, лето кажется бесконечным, пока оно не закончится, и мой отец..

Что в лицо
Очерк о возвращении физиогномики и о том, почему мы должны это приветствовать. История начинается со странной науки. Р. Тора Бьорнсдоттир, Николас О. Рул. Видимость социального класса по..

Почему шаблоны проектирования и почему нет?
Сложность — мать всех проблем в программировании. Программное обеспечение должно быть разработано с точки зрения того, кто его поддерживает, а не того, кто его пишет, потому что программное..

Создание дизайна обуви с помощью машинного обучения
Обувь. Что подождать? Я думал, что речь пойдет о машинном обучении! Ну это так. Если бы вы пошли на Amazon, сколько обуви вы бы нашли? Наверное, много, не так ли? Но много ли в них..

GraalVM в 2022 году: итоги года
2022 год был очень продуктивным для проекта и сообщества GraalVM. Вместе мы разработали множество новых функций, выпустили GraalVM для последних версий Java и новых платформ и увидели несколько..