GNU/Linux >> Linux Esercitazione >  >> Linux

Come eseguire il grep di una sezione di un file nella shell bash

grep non è adatto per questo compito, devi andare uno strumento "su":

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

Uscita:

B
C
D
E
B
C
E

Per quanto riguarda l'ennesimo requisito, penso che sia più semplice se avanzi di nuovo uno strumento "verso l'alto", vale a dire awk:

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

Uscita:

B
C
E

La bandiera f verrà impostato quando /^B/ viene rilevato e disattivato quando /^E/ si verifica, più o meno allo stesso modo in cui funziona la notazione sed. n tiene un conteggio di quanti blocchi sono passati e quando f == 1 && n == wanted è true, verrà eseguito il blocco predefinito ({ print $0 } ).


sed di @Thor comando non può essere superato, ma con il seguente perl script Provo a rispondere alla parte della tua domanda tra parentesi:"... l'(ennesima) occorrenza ...".

Utilizzo:

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

Esempi con il file nella tua domanda:

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

Non c'è alcun controllo degli errori o altro e lo script non è avido, cioè da A B C D E E F solo B C D E verrà grep con 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. Come controllare la sottostringa in Shell Script Bash?

  2. Grep Come sopprimere la visualizzazione di file non corrispondenti?

  3. Come analizzare un file CSV in Bash?

  4. Come controllare syslog in Bash su Linux?

  5. Come grep per unicode � in uno script bash

Come leggere i file riga per riga in Bash

Come leggere un file riga per riga in Bash

Come reindirizzare stderr a stdout in Bash

Come trovare una stringa in un file su Linux

Come installare Linux Bash Shell su Windows 10

Come verificare se esiste un file o una directory in Bash Shell