GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Linux - grep von bestimmten Zeilen bis zum Ende der Datei

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.


Linux
  1. Verwenden von Google Drive über die Linux-Befehlszeile

  2. Löschen bestimmter Zeilen aus einer Datei in der Linux-Befehlszeile

  3. Migrieren eines Linux-Servers über die Befehlszeile

  4. Wie man Zeilen in einer Datei in UNIX/Linux zählt

  5. Linux - Prüfen Sie, ob am Ende einer Datei eine leere Zeile steht

Programmieren Sie Hardware über die Linux-Befehlszeile

Kopieren Sie eine Datei in mehrere Verzeichnisse von der Befehlszeile unter Linux

Zeigen Sie den Inhalt einer Datei in der Linux-Befehlszeile an

So finden Sie die längste(n) Zeile(n) in einer Datei in Linux

5 Befehle zum Anzeigen des Inhalts einer Datei in der Linux-Befehlszeile

Entfernt eine bestimmte Zeile aus der Bash-Verlaufsdatei