• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

Log Files vergleichen

MisterX

Newbie
Hallo,

ich habe zwei Logs- Files in folgender Form:

file1.txt:

Port
443 17.168.10.10
22 192.168.125.4
80 10.8.164.30
21 10.17.77.33
80 10.7.17.10
......

file2.txt:
10.8.164.30 server1
10.8.164.57 server2
10.3.32.30 server3
10.17.77.33 server4
10.25.23.2 server5
........


Die IP Adressen in file1 sollen mit den Adressen + Hostnames in file2 verglichen werden. Der erwartete output wäre dann folgender:

80 10.8.164.30 server1
21 10.17.77.33 server4

Kann mir hier vielleicht jemand weiterhelfen?

Wenn ich die Port- Zuordnung (erste Spalte) aus file1.txt herausnehme, dann bekomme ich den Abgleich mit file2.txt hin:

for i in $(cat file1.txt); do grep -w $i file2.txt; done

Viele Dank im Vorraus und Grüße
 

moenk

Administrator
Teammitglied
Einlesen in LibreOffice mit Space als Delimiter und dann mit SVerweis zusammenbasteln?
 
A

Anonymous

Gast
join ist ein brauchbarer Befehl dafür, aber geht leider erst nachdem die Daten sortiert sind. Normalerweise müsste auch noch ein uniq drüber sonst gibt's gerade bei Logs wo Einträge auch mehrmals vorkommen können eventuell Probleme, also hier ziemlich unpraktisch. aber vielleicht mal als Anregung:
Code:
sort -k 2 file1.txt > file3.txt
sort -k 1 file2.txt > file4.txt
join -1 2 -2 1 file3.txt file4.txt | cut -d " " -f 1,3
Tabellenkalkulation, ist nur was für Studierte und leitende Mitarbeiter ;)

Auf der reinen Shellkonsole eventuell umständlich und in solchen Fällen wird das bei großen Datensätzen ziemlich langsam, aber dennoch leicht machbar. hier mal kleines Beispiel.
(Das eventuell funktioniert wenn in file2.txt die Daten nicht mehrfach vorkommen, ansonsten muss man eventuell bei grep mit "-m 1" gegenwirken)
Code:
while read P IP ; do grep $IP file2.txt; done < file1.txt
AWK wäre aber eine gute Möglichkeit: (versteht aber kaum noch jemand)
hier mal 2 Möglichkeiten je nachdem was dich mehr interessiert was in file1.txt oder in file2.txt nicht enthalten ist
Code:
awk 'r==""{r=FILENAME};r==FILENAME{A[$2]+=1};r!=FILENAME{if(A[$1]){print $1,$2}else{print $1,"\t\tin",r,"nicht enthalten"}}' file1.txt file2.txt

awk 'r==""{r=FILENAME};r==FILENAME{A[$1]=$2};r!=FILENAME{if(A[$2]){print $2,A[$2]}else{print $2,"\t\tin",r,"nicht enthalten"}}' file2.txt file1.txt
awk hat hier so seine Vorteile insbesondere bei großen Dateien oder wenn mehrere Dateien mit einer Datei verglichen werden sollten. ZB. bei Variante 2 könntest du hinten einfach auch gleich mehrere Dateiname angeben die das Format von file1.txt haben.
 

framp

Moderator
Teammitglied
robi schrieb:
AWK wäre aber eine gute Möglichkeit: (versteht aber kaum noch jemand)
Daran merkt man dass man alt wird :lol:

Es ist ja nicht nur ein einfacher Vergleich sondern auch noch etwas mehr und genau dafür ist awk prädestiniert :thumbs:
 
OP
M

MisterX

Newbie
Guten Morgen,

vielen Dank für die Antworten:

Ich habe es jetzt so gelöst:

Code:
less file1.txt |sort -d |uniq > file3.txt
less file3.txt | cut  --output-delimiter=" " -f1-3 > file4.txt
awk 'NR==FNR{a[$1]=$2;next}a[$2]{print $0"\t"a[$2]}' file2.txt file4.txt > file5.txt

awk '{$2=$2};1' file5.txt | sed 's/ /;/g' > excel.csv

Ist zwar ein bisschen umständlich und wäre bestimmt auch einfacher gegangen :D

Viele Grüße
 

josef-wien

Ultimate Guru
MisterX schrieb:
wäre bestimmt auch einfacher gegangen
Zumindest hinsichtlich der unnützen Verwendung von less und uniq stimme ich Dir zu:
Code:
sort -du file1.txt > file3.txt
cut --output-delimiter=" " -f1-3 file3.txt > file4.txt
Oder wenn file3.txt sonst nicht benötigt wird:
Code:
sort -du file1.txt | cut --output-delimiter=" " -f1-3 > file4.txt
 
Oben