GNU/Linux >> Znalost Linux >  >> Linux

Jak grepovat část souboru v bash shellu

grep není pro tento úkol příliš vhodný, musíte jít o jeden nástroj "nahoru":

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

Výstup:

B
C
D
E
B
C
E

Pokud jde o N-tý požadavek, myslím si, že je nejjednodušší, když znovu posunete jeden nástroj „nahoru“, konkrétně awk:

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

Výstup:

B
C
E

Příznak f bude nastaveno, když /^B/ je zjištěno a není nastaveno při /^E/ vyskytuje, hodně stejným způsobem funguje zápis sed. n uchovává záznam o tom, kolik bloků prošlo a kdy f == 1 && n == wanted je true, bude proveden výchozí blok ({ print $0 } ).


@Thor's sed příkaz nelze překonat, ale s následujícím perl skript Snažím se odpovědět na část vaší otázky v závorce:"... (N-tý) výskyt ...".

Použití:

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

Příklady se souborem ve vaší otázce:

$ ./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

Neexistuje žádná kontrola chyb nebo cokoli jiného a skript není chamtivý, tj. z A B C D E E F pouze B C D E bude grep'ed s N=1.

#!/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. Jak analyzovat soubor CSV v Bash?

  2. Jak zkontrolovat syslog v Bash na Linuxu?

  3. Jak 'grep' nepřetržitý proud?

  1. Jak zkontrolovat, zda je soubor prázdný v Bash?

  2. Jak zahrnout soubor do skriptu bash shell

  3. Jak grep \nv souboru

  1. Jak vytvořit dočasný soubor ve skriptu Shell?

  2. Jak na to:Neomezená historie Bash/shell?

  3. Jak grep pro unicode � ve skriptu bash