2012-05-14 12 views
12

Estoy escribiendo el guión que busca las líneas que coinciden con algún patrón. Debo usar sed para este script. Esto funciona bien para la búsqueda y líneas de impresión encontrados:Líneas de numeración que coinciden con el patrón usando sed

sed -n /PATTERN/p 

Sin embargo, también me gustaría imprimir el número de líneas emparejado frente a la propia línea. ¿Cómo puedo hacer eso usando sed?

+2

¿Quieres ellas numeradas consecutivamente o en función de su número de línea en el archivo? –

Respuesta

13

Puede utilizar grep:

grep -n pattern file 

Si utiliza = en sed el número de línea se imprimirán en una línea independiente y no está disponible en el espacio de patrones para la manipulación. Sin embargo, puede canalizar la salida a otra instancia de sed para fusionar el número de línea y la línea a la que se aplica.

sed -n '/pattern/{=;p}' file | sed '{N;s/\n/ /}' 
+0

¡esto es perfecto! La solución de Sed funciona muy bien. ¡Gracias! – almas

2

Cambiar a awk.

BEGIN { 
    ln=0 
} 

$0 ~ m { 
    ln+=1 
    print ln " " $0 
    next 
} 

{ 
    print $0 
} 

...

awk -f script.awk -v m='<regex>' < input.txt 
9

= se utiliza para imprimir el número de línea.

sed -n /PATTERN/{=;p;} 
+0

hago esto: cat "$ FILE" | sed -n/"$ pattern"/{=; p;}, pero obtengo el error: error de sintaxis cerca del token inesperado '} ' – almas

+0

necesita'; =; ... 'buena suerte. – shellter

+3

@zum: Mueva las comillas para que estén fuera del script: 'sed -n"/$ pattern/{=; p;} "" $ FILE "' –

2

Utilizando Perl:

perl -ne 'print "$.: $_" if /regex/' input.file 

$. contienen número de línea. Si el archivo de entrada contiene:

record foo 
bar baz 
record qux 

Esta sola línea: perl -ne 'print "$.: $_" if /record/' input.file imprimirá:

1: record foo 
3: record qux 

O si lo que desea es el número total de líneas emparejado un uso patrón:

perl -lne '$count++ if /regex/; END { print int $count }' input.file

8

Para sed, use siguiente para obtener el número de línea

sed -n /PATTERN/= 
1

Aquí es la forma más simple:

awk '{print ln++ ": " $0 }' 
Cuestiones relacionadas