GNU/Linux >> Tutoriales Linux >  >> Linux

Cómo grep una sección de un archivo en bash Shell

grep no es adecuado para esta tarea, debe ir una herramienta "hacia arriba":

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

Salida:

B
C
D
E
B
C
E

Con respecto al requisito Nth, creo que es más fácil si vuelve a avanzar una herramienta "hacia arriba", a saber, awk:

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

Salida:

B
C
E

La bandera f se establecerá cuando /^B/ se encuentra y se desactiva cuando /^E/ ocurre, de la misma manera que funciona la notación sed. n lleva la cuenta de cuántos bloques han pasado y cuándo f == 1 && n == wanted es verdadero, se ejecutará el bloque predeterminado ({ print $0 } ).


sed de @Thor El comando no puede ser superado, pero con el siguiente perl guión Intento abordar la parte de su pregunta entre paréntesis:"... la (N-ésima) aparición...".

Uso:

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

Ejemplos con el archivo en su pregunta:

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

No hay comprobación de errores ni nada por el estilo y el script no es codicioso, es decir, de A B C D E E F solo B C D E se combinará 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. ¿Cómo crear un archivo temporal en Shell Script?

  2. ¿Cómo cambiar Cron Shell (sh a Bash)?

  3. ¿Cómo 'grep' una secuencia continua?

  4. Cómo:¿Historial ilimitado de Bash/shell?

  5. Cómo hacer grep para Unicode en un script bash

Cómo leer archivos línea por línea en Bash

Cómo leer un archivo línea por línea en Bash

Cómo redirigir stderr a stdout en Bash

Cómo encontrar una cadena en un archivo en Linux

Cómo instalar Linux Bash Shell en Windows 10

Cómo verificar si existe un archivo o directorio en Bash Shell