2012-10-28 16 views
13

Ich habe eine große Textdatei, ich möchte, um die Linien sehen enthalten "time spent" in dieser Textdatei, die ich benutze:Wie grep eine Zeichenfolge nach einer angegebenen Zeilennummer?

grep -in "time spent" myfile.txt 

Aber ich bin nur daran interessiert, in den Leitungen nach 50000. In der Ausgabe mag ich siehe Zeilen nach 50000 und die "Zeit verbraucht" enthalten. Gibt es eine Möglichkeit, dies zu tun?

Antwort

27

Sie können es Schwanz, dann grep:

tail -n +50000 myfile.txt | grep -in "time spent" 
+1

, die nicht so gut funktioniert, da es vermasselt die Zeilennummerierung – BeniBela

+0

Beachten Sie das '+' Zeichen. es scheint nutzlos, aber es bedeutet etwas anderes als tail -n 50000, es bedeutet: Schwanz beginnend bei Zeile 50000 iso lat 50000 Zeilen – gkephorus

4

Alternativ können Sie sed verwenden. sed kann grep wie diese verwendet werden, um zu imitieren: jede Zeile sed drucken

sed -n 's/pattern/&/p'

standardmäßig selbst tritt auf, wenn keine Substitution. Die Kombinationen -n und /p lassen sed nur die Zeilen drucken, an denen eine Ersetzung stattgefunden hat. Schließlich ersetzen wir pattern durch &, was bedeutet, pattern durch sich selbst ersetzen. Ergebnis: wir haben nur grep nachgeahmt.

Jetzt sed kann eine Reihe von Linien, auf denen zu handeln. In Ihrem Fall:

sed -n '50000,$s/time spent/&/p' myfile.txt

Das Format angeben, der Bereich wie folgt lautet: start,end Wir haben gerade sed anweisen von der Linie 50000 bis $ zu arbeiten, die letzte Zeile bedeutet.

+7

Die angenommene Antwort ist richtig. Beachten Sie, dass 'tail -n + 2' (alle Zeilen beginnend bei Zeile 2) sich sehr stark von' tail -n2' (nur die letzten 2 Zeilen) unterscheidet. – user113215

+1

Ja, das habe ich nicht verstanden. Sehr gut zu wissen, danke für den Hinweis darauf – neric

+1

Ich mag die Sed Ansatz. Nur ein Programm benötigt, keine Pipe. – gkephorus

1

könnten Sie verwenden head + grep und Gruppe mit {...} Befehle, so dass sie den gleichen Eingang teilen:

{ head -n 50000 >/dev/null; grep -i PATTERN; } < infile 

head nicht den gesamten Eingangs verbrauchen, es wird nur die ersten 50.000 Zeilen und Dumps sie /dev/null; Die restlichen Zeilen werden von grep verarbeitet.
Wenn Sie die Zeilennummern vorangestellt benötigen (wie bei grep -in), könnten Sie verwenden awk:

awk 'NR>50000 && tolower($0)~/PATTERN/{print NR ": " $0}' infile 
2

Antwort für greppen zwischen 2 Zeilennummern:

Using sed and grep: 

sed -n '1,50000p' someFile | grep <your_string> 
Verwandte Themen