2010-05-26 13 views
32

Muchas veces voy a grep -n archivo whatev para encontrar lo que estoy buscando. Dicen que la salida esCómo "grep" rangos de línea específicos de un archivo

1234: whatev 1 
5555: whatev 2 
6643: whatev 3 

Si quiero a continuación, sólo extraer las líneas entre 1234 y 5555, ¿hay una herramienta para hacer eso? Para los archivos estáticos, tengo un script que hace wc -l del archivo y luego hace los cálculos para dividirlo con el encabezado &, pero eso no funciona tan bien con los archivos de registro que se escriben constantemente.

+4

Ver http://stackoverflow.com/questions/83329/how-can-i-extract-a-range-of-lines-from-a-text- file-on-unix – GreenMatt

Respuesta

53

Pruebe usar sed como se menciona en http://linuxcommando.blogspot.com/2008/03/using-sed-to-extract-lines-in-text-file.html. Por ejemplo, use

sed '2,4!d' somefile.txt 

para imprimir desde la segunda línea a la cuarta línea de somefile.txt. (Y no se olvide de comprobar http://www.grymoire.com/Unix/Sed.html, sed es una herramienta maravillosa.)

+3

Un bit de información de seguimiento útil es cómo anteponer los números de línea al resultado sed ... métalo en nl como así: 'sed ''" $ start "','" $ end "' ! d 'somefile.txt | nl -ba -v $ start' – phyatt

0

poner esto en un archivo y hacerlo ejecutable:

#!/bin/bash 
start=`grep -n $1 < $3 | head -n1 | cut -d: -f1; exit ${PIPESTATUS[0]}` 
if [ ${PIPESTATUS[0]} -ne 0 ]; then 
    echo "couldn't find start pattern!" 1>&2 
    exit 1 
fi 
stop=`tail -n +$start < $3 | grep -n $2 | head -n1 | cut -d: -f1; exit ${PIPESTATUS[1]}` 
if [ ${PIPESTATUS[0]} -ne 0 ]; then 
    echo "couldn't find end pattern!" 1>&2 
    exit 1 
fi 

stop=$(($stop + $start - 1)) 

sed "$start,$stop!d" < $3 

Ejecutar el archivo con argumentos (NOTA de que el guión no lo hace manejar espacios en los argumentos):

  1. partir patrón grep
  2. Detener patrón grep
  3. ruta de archivos

para usar con su ejemplo, utilizar argumentos: 1234 5555 myfile.txt

incluye líneas con partida y el patrón de detenerse.

+3

downvoters, por favor explique –

15

El siguiente comando hará lo que usted solicitó "extraer las líneas entre 1234 y 5555" en algúnArchivo.

sed -n '1234,5555p' someFile

+1

Tuve que agregar '/' delimitadores para hacerlo funcionar: 'sed -n '/ 1234 /,/5555/p' someFile' – JB0x2D1

+0

Bastante útil :) +1 –

0

Si desea líneas en lugar de línea de rangos, puede hacerlo con el Perl: por ejemplo. Si desea obtener la línea 1, 3 y 5 de un archivo, por ejemplo/etc/password:

perl -e 'while(<>){if(++$l~~[1,3,5]){print}}' < /etc/passwd 
+2

FYI, ese '$ l' es" dollar el "no" dollar one ". Un comando más perlish (es decir, más corto) es 'perl -ne 'si ($. ~~ [1,3,5]) {print}'/etc/passwd'. –

3

Si he entendido bien, que desea encontrar un patrón entre dos números de línea. El awk de una sola línea podría ser

awk '/whatev/ && NR >= 1234 && NR <= 5555' file 

No es necesario ejecutar grep seguido por sed.

Perl de una sola línea:

perl -ne 'if (/whatev/ && $. >= 1234 && $. <= 5555') {print}' file 
Cuestiones relacionadas