2016-06-03 5 views
0

Hoffnung Titel ist selbsterklärend, aber ich werde immer noch versuchen, klarer zu werden, was ich versuche zu tun. Ich suche nach einer Zeichenfolge "Live-Nachricht" in meinen Protokolldateien. Mit dem einfachen Befehl grep kann ich diese Informationen aus allen Dateien in einem Ordner abrufen. Der Befehl ich benutze ist wie folgt,Suchen einer Zeichenfolge mit Grep in einem Bereich von mehreren Dateien

grep "Live message" * 

Da ich Log-Dateien haben im Bereich zurück bis Mitte letzten Jahres, ist es eine Möglichkeit, einen Bereich mit grep zu definieren, für diese bestimmte Zeichenfolge zu suchen. Meine Log-Dateien werden wie folgt angezeigt,

commLogs.log.2015-11-01 
commLogs.log.2015-11-01 
commLogs.log.2015-11-01 
... 
commLogs.log.2016-01-01 
commLogs.log.2016-01-02 
... 
commLogs.log.2016-06-01 
commLogs.log.2016-06-02 

Ich mag würde für „Live-Nachricht“ suchen, innerhalb 2016.01.01 - 2016.06.02 Bereich, jetzt jeden Dateinamen zu schreiben wäre sehr hart und tidious wie dies,

grep "Live message" commLogs.log.2016-01-01 commLogs.log.2016-01-02 commLogs.log.2016-01-03 ... 

Gibt es einen besseren Weg als das?

Vielen Dank im Voraus für jede Hilfe

+0

Wie möchten Sie eine Reichweite übrigens geben? – user1939168

Antwort

0
ls * | sed "/2015-06-01/,/2016-06-03/p" -n | xargs grep "Live message" 

ls * ist alle Log-Datei (besser sortiert nach Datum), auf find -type f -name ...

sed "/<BEGIN_REGEX>/,/<END_REGEX>/p" -n Filter alle Linie zwischen BEGIN_REGEX und END_REGEX

werden ersetzen können

xargs grep "Live message" übergeben Sie alle Dateien an Grep

+0

Danke aropan, es funktioniert super ... Danke für die ausführliche Erklärung jedes einzelnen Schrittes. Übrigens, nur neugierig, gibt es eine Möglichkeit, wie oft "Live-Nachricht" in diesem bestimmten Bereich erscheint? – rac3b3nn0n

+1

Normalerweise sollten Sie [vermeiden Parsing der Ausgabe von ls] (http://mywiki.wooledge.org/ParsingLs) – andlrc

+1

@andlrc 'grep -c ...' funktioniert nicht, weil viele Dateien – aropan

1

Sie sind Fort Unate, dass Ihre Daten in YYYY-MM-DD Mode gespeichert sind; es ermöglicht Ihnen, Daten zu vergleichen, indem lexikographisch Strings verglichen werden:

for f in *; do 
    d=${f#commLogs.log.} 
    if [[ $d > 2016-01-00 && $d < 2016-06-02 ]]; then 
     cat "$f" 
    fi 
done | grep "Live message" 

Dies ist nicht ideal; Es ist ein wenig ausführlich und erfordert mehrere Male ausgeführt cat. Es kann durch die Speicherung von Dateinamen in einem Array verbessert werden, was so lange arbeiten, wie die Anzahl der Spiele wächst nicht zu groß:

for f in *; do 
    d=${f#commLogs.log.} 
    if [[ $d > 2016-01-00 && $d < 2016-06-02 ]]; then 
     files+=("$f") 
    fi 
done 
grep "Live message" "${f[@]}" 

auf dem Bereich Abhängig Sie in der Lage sein können, ein geeignetes Muster zu schreiben um den Bereich anzupassen, aber es wird schwierig, da Sie nur Muster Strings, nicht numerische Bereiche pattern können.

grep "Live message" commLogs.log.2016-0[1-5]-* commLogs.log.2016-06-0[1-2] 
+0

Danke für die grep Aussage, ich habe versucht, es aber laufen es fehlt (aus irgendeinem Grund) einige Log-Dateien, wie es beginnt mit 2016-01-01 und springt dann zu 2016-01-04, während ich "Live Stream" in 02 und 03 Log-Dateien überprüft und auch gefunden habe. – rac3b3nn0n

+0

Hm.Ich frage mich, ob 'grep' die Dateien nicht notwendigerweise in der Reihenfolge sucht, in der sie in der Befehlszeile angezeigt werden. – chepner

+0

Könnte sein, die Lösung von @aropan hat gut funktioniert – rac3b3nn0n

Verwandte Themen