Frage grep eine Datei, zeige aber mehrere umgebende Zeilen?


Ich würde gern grep für eine Zeichenfolge, sondern auch die vorherigen fünf Zeilen und die folgenden fünf Zeilen sowie die übereinstimmende Zeile. Wie könnte ich das machen?


2748
2017-08-12 17:55


Ursprung


Antworten:


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

grep -B 3 -A 2 foo README.txt

Wenn Sie die gleiche Anzahl von Zeilen vor und nach verwenden möchten -C num.

grep -C 3 foo README.txt

Dies zeigt 3 Zeilen vor und 3 Zeilen danach.


3667
2017-08-12 17:57



-A und -B wird funktionieren, wie es geht -C n (zum n Linien des Kontexts) oder einfach -n (zum n Linien des Kontexts).


520
2017-08-12 17:59



ack arbeitet mit ähnlichen Argumenten wie grep und akzeptiert -C. Aber normalerweise ist es besser, den Code zu durchsuchen.


66
2017-09-07 11:13



grep astring myfile -A 5 -B 5

Das wird "myfile" für "astring" grep und zeigt 5 Zeilen vor und nach jedem Spiel


32
2017-08-12 17:58



Ich benutze normalerweise

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

Viele der Tools wie Grep haben auch wirklich tolle Man-Dateien. Ich verweise mich darauf greps Man-Seite viel, weil es so viel gibt, was man damit machen kann.

man grep

Viele GNU-Tools haben auch ein Infoseite das kann nützlichere Informationen zusätzlich zur Manpage enthalten.

info grep

16
2017-08-12 18:42



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

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;

8
2017-10-08 00:21



Benutze 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

5
2018-01-12 11:25



ripgrep

Wenn Sie sich für die Leistung interessieren, verwenden Sie ripgrep die ähnliche Syntax wie grep, z.B.

rg -C5 "pattern" .

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

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

Das Werkzeug ist auf gebaut Rosts Regex-Engine Das macht es sehr effizient auf den großen Daten.


2
2018-04-11 10:28



Hier ist das @ Ygor Lösung im 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 Anzahl der Zeilen davor und danach.

Es ist besonders nützlich für Systeme, die Grep nicht unterstützt -A, -B und -C Parameter.


0
2018-04-11 10:24