Ayuda SED (Stream EDitor)

Buenas,

tengo un fichero de texto de 150000 lineas, del que me
gustaría extraer 10 lineas que cumplan un patrón de
búsqueda, y me devuelva además el último número de
línea buscado, para posteriormente hacer búsquedas
sucesivas del resto del fichero.

Por ejemplo, empieza a buscar desde la línea 1 y encuentra
las 10 ocurrencias, acabando en la línea 3000. En la segunda
búsqueda, deberá comenzar en la línea 3001 hacia adelante,
y así sucesivamente.

El problema es que no sé cómo decirle que pare cuando
ha encontrado la línea 10.

Gracias de antemano,

Enzo
Ni idea, pero igual te sirve esto.

Un saludo.
Gracias, buen post!

He mirado uno que siempre sale referenciado en San Gugle,
por si a alguien más le interesa empezar con SED, más básico
pero todo ejemplos.

http://www.pement.org/sed/sed1line.txt

Se ve que hay libros de petete sobre el tema, vamos, un lenguaje
de programación enterito, pa perderse, porque hay cada ejemplo ....


Salados y gracias de nuevo,

Enzo
Para ese caso en concreto es más fácil usar awk, en menos de 10 líneas lo tienes.

Con sed vas a tener más complicado el guardar el 'estado'. Se me ocurre que podrías ir guardando un caracter en el buffer y salir con un patrón como a\{10\}. La última línea la tienes en el comando =.

Algo así:

/tu patron/ {
    p
    s-^.*$-a-
    H
    g
    s-\n--g
    /^a\{10\}$/ {
        =
        s-.--g
        q
    }
}


No lo he probado claro...

- ferdy
Nas,
Luego, lo pruebo Ferdy y te digo algo ...
(es que ahora me toca bañar al nene!)

Supongo que también habrá una versión para
windows, ya que necesito este script para
2 servers, uno con Linux y otro con W2000S

Muchas gracias, ye te comentaré si va bien y/o
añadiduras y complicaciones

Saludotes,

Enzo
Debería haber algo para windows, busca un gawk.exe o un sed.exe que no dependan de Cygwin.

De todos modos el script está hecho en el aire... así que fijo que no funciona a la primera.

- ferdy
Nas agains,

bueno, el script ya está claro, pero lo que no encuentro en ningún
lado es como empezar a buscar el patrón a partir de la línea 'n'
del fichero. Quizás no se puede hacer con awk ...? O con una mezcla
de awk y sed?

[EDITO]

jopé, era más fácil de lo que parecía!
Por si a alguien le interesa, aquí dejo el script, que sirve para
ir llenando un box de resultados de 10 en 10, a través de la
interacción del usuario ... (es para no llenar un combo con
180000 referencias!). La variable NR sirve para empezar a
buscar a partir de ese registro:


BEGIN { res = 1; lin = 1; pat = "textoabuscar"; }
{ if (res<=10; NR>1; $0~ pat) { print res, NR, $0; res++; } }


Gracias de nuevo y saludotes,

Enzo
En sed también muy simple:

linea,$ {
    /tu patron/ {
        p
        s-^.*$-a-
        H
        g
        s-\n--g
        /^a\{10\}$/ {
            =
            s-.--g
            q
        }
    }
}


(habría que hacer un 'wrapper' para cambiar linea y punto)

- ferdy
Hola Ferdy,

me había olvidado de poner en el mensaje anterior,
que el ejemplo está hecho para 'awk'. Quizás es bastante
menos críptico que la sintaxis de 'sed'.

En el último ejemplo que has editado, me presenta todos
los registros, no hace caso del patrón .... bueno, sí marca
con la 'a' cada vez que encuentra una coincidencia, pero
enseña todos.

Ultima modificacion (y final, espero);


BEGIN {
res = 1; ini = 40000; max = 10; txt = "TROLL";
}

{
if ( res <= max && NR >= ini && $0 ~ txt ) { print res, NR, $0; res++ }
if ( res > max ) { exit; }
}

END { print ">>>", NR }



Sólo echo de menos que no pueda empezar a buscar por el NR
que yo quiera.

Saludotes y gracias,

Nz
8 respuestas