Ich möchte von "Zeile 2A" bis zum Ende der Datei "grep":
sed -n '/2A/,$p'
- -n :
sedunterdrücken Standardausgabe - /2A/ :Ausgabezeilen von der ersten, die "2A" enthält
- $ :bis zum Ende der Datei
Ich möchte "grep" von "Zeile 2A" zur nächsten Zeile, die "A" enthält:
sed -n '/2A/,/A/p'
- /A/ :Ausgabe bis eine Zeile "A" enthält
Ich möchte von der ersten Zeile, die "A" enthält, zur nächsten "grep":
printf "/A\n.+1,/A/p\nq" | ed -s
$ > foo echo "line 1
line 2A
line 3
line 4A
line 5"
$ sed -n '/2A/,$p' foo
line 2A
line 3
line 4A
line 5
$ sed -n '/2A/,/A/p' foo
line 2A
line 3
line 4A
$ printf "/A\n.+1,/A/p\nq" | ed -s foo
line 2A
line 3
line 4A
(aus Kommentar erweitert)
awk hat die Fähigkeit, "Bereiche" von Zeilen auszuwählen, die diesen Anforderungen perfekt entsprechen, wie im GNU-awk (gawk)-Handbuch beschrieben. (Diese Funktion funktioniert in anderen awk s aber die gawk Handbuch ist einfach zu verlinken.)
awk '/line 2A/,0' druckt Zeilen beginnend mit der ersten, die line 2A entspricht und bis zum Ende der Eingabe fortgesetzt, weil 0 ist eine Bedingung, die niemals wahr ist.
awk '/line 2A/,/A/&&!/line 2A/' beginnt den Druck mit einer Zeile, die line 2A entspricht und stoppt nach einer Zeile, die A entspricht aber NICHT line 2A (und kann daher nicht dieselbe Linie wie die Startlinie sein). Es beginnt wieder auf einem folgenden line 2A usw; Wenn Sie das verhindern möchten, gibt es etwas kompliziertere Möglichkeiten, dies zu tun.
Wenn die Stoppzeilen immer ein anderes Zeichen als 2 haben vor dem A dies kann zu awk '/line 2A/,/[^2]A/' vereinfacht werden die nach einer Zeile stoppt, die mit einem anderen Zeichen als 2 übereinstimmt, gefolgt von A. Vielleicht möchten Sie eine Variation davon, z. um bei einem beliebigen einstelligen A zu stoppen, das sich von 2A unterscheidet, aber nicht bei anderen As wie WHAT; dafür könnte die Stoppbedingung ,/line [013-9]A/ sein .
Ich denke, der beste Weg ist, grep zu verwenden in Kombination mit cut und tail . Verwenden Sie zunächst grep, um die Zeile zu erhalten, in der sich die gewünschte Zeichenfolge befindet (-n Zeilennummer ausgeben; -m 1 um die Suche nach dem ersten Treffer zu beenden):
grep -n -m 1 "somestring" filename.txt
Dies gibt die Zeilennummer und den String selbst aus. Um den String wegzuschneiden, verwenden wir cut (-f1 :erstes Feld ausgeben; -d: Verwenden Sie ":" als Trennzeichen):
grep -n -m 1 "somestring" filename.txt | cut -f1 -d:
Als nächstes verwenden wir die Ausgabe dieses Befehls als Parameter in tail. Normalerweise gibt tail die letzten k Zeilen aus, aber mit -n +k , erhalten wir tail zum Drucken ab Zeile k. Der Gesamtbefehl lautet:
tail -n +`grep -n -m 1 "somestring" filename.txt | cut -f1 -d:` filename.txt
Zur Ausgabe der Zeilen bis somestring Verwenden Sie head statt tail und -n -# statt -n +# . Sie können auch beide kombinieren, um die Linien von einer Zeichenfolge zur anderen zu erhalten.