Frage

Ich möchte grep einer Zeichenkette, zeigen aber auch die letzten fünf Zeilen und die folgenden fünf Zeilen sowie die abgestimmte Linie.Wie würde ich in der Lage sein, dies zu tun?

War es hilfreich?

Lösung

Für BSD oder GNU grep Sie können verwenden -B num um festzulegen, wie viele Zeilen vor dem Spiel -A num für die Anzahl der Linien nach dem Spiel.

grep -B 3 -A 2 foo README.txt

Wenn Sie wollen die gleiche Anzahl von Zeilen vor und nach können Sie Sie nutzen -C num.

grep -C 3 foo README.txt

Dies zeigt 3 Zeilen vor und 3 Zeilen nach.

Andere Tipps

-A und -B wird arbeiten, wird als -C n (für n Zeilen Kontext), oder nur -n (für n Zeilen Kontext...solange n ist 1 bis 9).

ack arbeitet mit ähnlichen Argumenten wie grep und akzeptiert -C.Aber es ist normalerweise besser für das durchsuchen von code.

grep astring myfile -A 5 -B 5

Das wird grep "myfile" für "astring", und zeigen Sie 5 Zeilen vor und nach jedem match

Ich normalerweise verwenden

grep searchstring file -C n # n for number of lines of context up and down

Viele der tools wie grep auch haben wirklich große Mann-Dateien zu.Ich finde mich beziehe grep man page eine Menge, weil es ist so viel können Sie tun mit es.

man grep

Viele GNU-Werkzeuge haben auch ein info-Seite , dass können haben mehr nützliche Informationen neben der man-Seite.

info grep

Suche nach "17655" in "/some/file.txt" mit 10 Zeilen Kontext vor und nach (mit Awk), Ausgabe vorangestellt Zeilennummer gefolgt von einem Doppelpunkt.Verwenden Sie diese auf Solaris, wenn 'grep' unterstützt nicht die "-[ACB]" Optionen".

awk '

/17655/ {
        for (i = (b + 1) % 10; i != b; i = (i + 1) % 10) {
                print before[i]
        }
        print (NR ":" ($0))
        a = 10
}

a-- > 0 {
        print (NR ":" ($0))
}

{
        before[b] = (NR ":" ($0))
        b = (b + 1) % 10
}' /some/file.txt;

Mit grep

$ grep --help | grep -i context
Context control:
  -B, --before-context=NUM  print NUM lines of leading context
  -A, --after-context=NUM   print NUM lines of trailing context
  -C, --context=NUM         print NUM lines of output context
  -NUM                      same as --context=NUM

ripgrep

Wenn Sie sich sorgen über die Leistung, Benutzung ripgrep die hat eine ähnliche syntax wie grep, z.B.

rg -C5 "pattern" .

-C, --context NUM - Show NUM Zeilen vor und nach jedem Spiel.

Es gibt auch Parameter wie -A/--after-context und -B/--before-context.

Das tool ist gebaut auf Rost ist regex engine das macht es sehr effiziente auf der großen Daten.

$grep thestring thefile -5

-5 erhält Sie 5 Linien oberhalb und unterhalb des Spiel 'thestring' ist äquivalent zu-C 5 ODER -A 5 -B 5

Grep hat eine option namens Context Line Control, Sie verwenden können die --contect in, dass, einfach,

| grep -C 5

oder

| grep -5

Sollte den trick tun

Hier ist die @Ygor Lösung in awk

awk 'c-->0;$0~s{if(b)for(c=b+1;c>1;c--)print r[(NR-c+1)%b];print;c=a}b{r[NR%b]=$0}' b=3 a=3 s="pattern" myfile

Hinweis:Ersetzen a und b Variablen mit der Anzahl von Zeilen vor und nach.

Es ist besonders nützlich für das system nicht unterstützt grep ist -A, -B und -C Parameter.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top