grep eine Datei, zeigen aber mehrere umliegende Linien?
-
08-06-2019 - |
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?
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.