Ich möchte von "Zeile 2A" bis zum Ende der Datei "grep":
sed -n '/2A/,$p'
- -n :
sed
unterdrü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.