2014-10-10 4 views
5

Ich habe eine große Protokolldatei, die ich versuche, es für bestimmte Wörter zu scannen. Im Allgemeinen werde ich einige Wörter haben, die ich auf meiner großen Protokolldatei grep und die Linie drucken muss, die diese Wörter enthält.Wie grep nach Zeilen, die bestimmte Wörter in einer Protokolldatei enthalten?

Ich weiß, wie einfach Grep in einer Datei zu tun. Angenommen, mein Dateiname lautet abc.log und ich muss eine Zeile finden, die das Wort "Hallo" enthält, dann mache ich das immer so und druckt die Zeile für mich aus.

grep -i "hello" abc.log 

Aber ich weiß nicht, wie man das Grep für die Kombination von Wörtern tut. Das heißt, ich hätte eine Liste von Wörtern und ich scanne meine abc.log-Datei nach all diesen Wörtern und ich drucke die Zeilen aus, die diese Wörter einzeln enthalten.

#!/bin/bash 

data="hello,world,tester" 

# find all the lines which contains word hello or world or tester 

Also in meinem oben Shell-Skript Ich werde meine Datenvariable geteilt und für hallo Wort suchen so jede Zeile in abc.log die hallo Wort enthält, werde ich es ausdrucken und in ähnlicher Weise mit Welt und Tester sowie.

Ich versuche, dieses ziemlich generische zu machen, so dass ich nur meine Liste der Wörter in der Datenvariablen hinzufügen muss, ohne die tatsächliche Logik der Protokollierung zu berühren.

Antwort

6

Wenn Sie Ihre Muster speichern in einer Datei, eine pro Zeile, können Sie grep -f file-with-patterns file-to-search.log

Aus der Manpage verwenden:

-f FILE, --file=FILE 
      Obtain patterns from FILE, one per line. The empty file 
      contains zero patterns, and therefore matches nothing. (-f is 
      specified by POSIX.) 
+0

dank o11c. In meinem Fall können Muster sehr stark wachsen, so dass der Ansatz der Datei gut ist, aber ich wollte noch etwas hinzufügen - drucken Sie die Zeile nicht aus, wenn sie ein bestimmtes Wort enthält. Wie werde ich das mit Ihrem derzeitigen Ansatz tun? – john

+0

@ user2809564 pipe die erste 'grep' durch' grep -v wordtoexclude' (oder '-e' oder' -f', etc) – o11c

+0

Danke. Es kann möglich sein, dass ich auch mehrere Muster ausschließen kann, also gibt es eine Möglichkeit, eine Datei zu erstellen, die Muster enthalten und Muster ausschließen soll, und diese Datei dann zum Ausführen des Grep zu verwenden? – john

6

ich einen regulären Ausdruck verwenden würde, wie folgt aus:

grep -E 'hello|world|tester' abc.log 
+0

Vielen Dank bruchowski. Es funktioniert gut. In meinem Fall kann ich mehr als drei Muster haben, also dachte ich mir, es entweder in einer Variablen zu speichern, wie ich es in meiner Frage gezeigt habe, und dann diese Variable aufzuteilen und sie entweder in eine Datei einzufügen oder sie zu speichern. Denkst du, es wäre besser, dieses generische in einem Shell-Skript zu machen? – john

+0

@ user2809564 Da die Länge der Befehlszeilenargumente begrenzt ist, wird dieser Ansatz * schließlich * fehlschlagen, wenn die Datei nicht ausgeführt wird. Ich bin mir nicht sicher, ob Ihr Datensatz * so * groß ist. – o11c

+0

@ user2809564 entweder ist ein guter Ansatz. Wenn Sie nicht zu viele Strings für die Suche haben möchten, gehe ich vielleicht mit diesem Inline-Ansatz vor und schließe mich einfach einem Array von Termen an '|' an, sonst würde die Antwort von o11c gut für Sie funktionieren – bruchowski

0

Neben bruchowski's answer, können Sie auch:

grep -i -e "hello" -e "world" -e "tester" abc.log 

OR

grep 'hello\|world\|tester' abc.log 

ODER

egrep 'hello|world|tester' abc.log 
Verwandte Themen