2017-06-09 2 views
-2

Ich bin auf Linux-Plattform und ich würde Hilfe mit dem Befehl benötigen, der meine Aufgabe oder einen Vorschlag, wie dies zu erreichen ist.Befehl zum Durchsuchen einer Datei auf der Grundlage der Eingabe in der anderen Datei

Ich habe 2 Textdateien, die erste Datei hat eine Liste von IDs (Log-ID) und die zweite Datei ist eine Protokolldatei, die Einträge von verschiedenen Aktivitäten mit Log-ID enthält.

Grundsätzlich möchte ich eine Log-ID aus der ersten Datei auswählen und suchen, ob diese Log-ID in der zweiten Datei vorhanden ist.

Die erste Datei hat 15000 Log-IDs und manuell wäre es nicht möglich, jede zu überprüfen.

Hier ist meine Codierung Versuch:
grep -q "LogID: 1005534" logfile.txt && echo "yes" || echo "no"

Aber, wie der Befehl mit allen Login-IDs iterieren ich habe?

Hier ist die LOGID und aktuelle Protokolldatei

enter image description hereenter image description here

+0

habe ich die folgenden Befehl 'grep -q„LogID: 1.005.534“logfile.txt && echo„ja“|| Echo "Nein" '. Aber wie man den Befehl mit allen Log-IDs iteriert, die ich habe. – sady

+2

Stack Overflow ist ein Platz, an dem Sie andere um Hilfe bitten können, damit Ihr Programm funktioniert, wenn Sie ein * spezifisches Problem * festgestellt haben. Um das zu tun, müssen Sie ein Programm geschrieben haben. Es wird erwartet, dass Sie sich zumindest anstrengen, anstatt nur Ihre Anforderungen hier zu deponieren und auf eine Lösung zu warten. – Borodin

+0

Bitte geben Sie Ihre textlichen Informationen als Text in der Frage an, nicht als Bild. – Yunnosch

Antwort

1

ich Ihren eigenen Versuch denken, mit grep, ganz in der Nähe ist.
Basierend auf den beiden Dateien am Ende dieser Antwort als Demo zitierte
(ein MCVE von Ihnen schön gewesen wäre, ...), schlage ich vor drei Listen zu machen, mit:

  • positiv: grep -of Ids.txt Logfile.txt | sort -u
  • negativ a: grep -vf Ids.txt Logfile.txt | grep -o "LogID: .*" | sort -u
  • negativ b: grep -o "LogID: .*" Logfile.txt >InIDs.txt && grep -vf InIDs.txt IDs.txt | sort -u

Hinweis:

012.351.
  • Wenn Ihr System zwei "Sortier" -Programme hat, z. Windows und GNU, stellen Sie sicher, die GNU-Version zu verwenden, d. H. Indem Sie den vollständigen Pfad zu binary angeben; Windows-Sortierung weiß nicht -u Option.
  • Diese Dateien haben UNIX-Zeilenenden (nur LF, nicht CRLF), das ist wichtig.
  • Annahme: Der String "LogID: dddddd" erst am Ende der Leitungen erfolgt

Umwelt IDs.txt
((diese Annahme kann mit anspruchsvolleren Regexes leicht entspannt, vielleicht entfernt sein) notieren Sie sich die 1005539, 1005540 nicht in Logfile.txt enthalten):

LogID: 1005534 
LogID: 1005535 
LogID: 1005536 
LogID: 1005537 
LogID: 1005538 
LogID: 1005539 
LogID: 1005540 

Umwelt Logfile.txt
(beachten Sie die 1005548 nicht in IDs enthalten.txt und die Linien mit identischer ID):

blabla LogID: 1005534 
bloblo LogID: 1005536 
blaablaa LogID: 1005534 
blublu LogID: 1005537 
blibli LogID: 1005548 
bluubluu LogID: 1005537 
bleble LogID: 1005538 

Ausgang, positiv:

LogID: 1005534 
LogID: 1005536 
LogID: 1005537 
LogID: 1005538 

Ausgang, eine negativer
(solche, die in Logfile.txt sind, aber nicht in IDs.txt):

LogID: 1005548 

Ausgang, negativ b
(solche, die in IDs.txt sind, aber nicht in Logfile.txt):

LogID: 1005535 
LogID: 1005539 
LogID: 1005540 
1

1: Erhalten Sie eindeutige IDs fr file1. Für jede ID, suchen sie in file2

sort -u file1 | while read ID; do 
    grep -q $ID file2 && echo $ID: YES || echo $ID: no # costly operation & repetitive 
done 

2: Wenn Sie viele Einträge (vor allem auf file2) haben. Einzigartig ist, erhalten alle IDs aus den beiden Dateien und vergleichen Notizen

sort -u file1 > /tmp/f1 
grep -i target.*logID file2 |sed 's/.*target://' |sort -u > /tmp/f2 # one-pass 
diff -y /tmp/f1 /tmp/f2 | grep -q ">" # YES list 
diff -y /tmp/f1 /tmp/f2 | grep ">" # no list 
+0

Respekt, nette alternative Art, das zu tun. – Yunnosch

Verwandte Themen