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

Wie man einen Abschnitt einer Datei in der Bash-Shell grep

grep für diese Aufgabe nicht gut geeignet ist, müssen Sie ein Werkzeug "nach oben" gehen:

sed -n '/^B/,/^E/p' infile

Ausgabe:

B
C
D
E
B
C
E

In Bezug auf die N-te Anforderung denke ich, dass es am einfachsten ist, wenn Sie wieder ein Tool "nach oben" vorschieben, nämlich awk:

awk '/^B/ { f = 1; n++ } f && n == wanted; /^E/ { f = 0 }' wanted=2 infile

Ausgabe:

B
C
E

Das Flag f wird gesetzt wenn /^B/ wird angetroffen und nicht gesetzt, wenn /^E/ auftritt, ähnlich wie die sed-Notation funktioniert. n hält fest, wie viele Blöcke passiert sind und wann f == 1 && n == wanted wahr ist, wird der Standardblock ausgeführt ({ print $0 } ).


@Thors sed Befehl kann nicht geschlagen werden, aber mit dem folgenden perl Skript Ich versuche, den Teil Ihrer Frage in Klammern anzusprechen:"... das (N-te) Vorkommen ...".

Verwendung:

./script <start-regex> <end-regex> [N]

Beispiele mit der Datei in Ihrer Frage:

$ ./script "B" "E" < examplefile
B
C
D
E
B
C
E

$ ./script "B" "E" 2 < examplefile
B
C
D
E
F
G
B
C
E

Es gibt keine Fehlerprüfung oder was auch immer und das Skript ist nicht gierig, dh von A B C D E E F nur B C D E wird mit N=1 gegrep'ed.

#!/usr/bin/perl

if ($ARGV[2] != "") { $n = $ARGV[2] } else { $n = 1 }
$begin_str = $ARGV[0];
$end_str = $ARGV[1];

while(<STDIN>) {
  if($_ =~ $begin_str) { $flag=1 }             # beginning of match, set flag    
  if($_ =~ $end_str && $flag eq 1) { $i++ }    # i-th occurence of end string

  if($i eq $n) {                               # end of match after n occurences of end string
    $flag=2;
    $i=0; 
  }

  if ($flag ge 1) {                            # append currrent line to matching part
    $out.=$_;
  }

  if($flag eq 2) {                             # after detection of end of match, print complete match
    print $out;
    # print "---\n";                           # separator after a match
    $out="";
    $flag=0;
  }

}

Linux
  1. Wie parse ich eine CSV-Datei in Bash?

  2. Wie kann man einen kontinuierlichen Stream „grep“?

  3. Wie grep \n in Datei

  4. Gewusst wie:Unbegrenzter Bash/Shell-Verlauf?

  5. Wie man in einem Bash-Skript nach Unicode sucht

So lesen Sie Dateien Zeile für Zeile in Bash

So lesen Sie eine Datei Zeile für Zeile in Bash

So leiten Sie stderr in Bash auf stdout um

So finden Sie eine Zeichenfolge in einer Datei unter Linux

So installieren Sie Linux Bash Shell unter Windows 10

So überprüfen Sie, ob eine Datei oder ein Verzeichnis in der Bash-Shell vorhanden ist