Utilice el comando sed para buscar en archivos de texto entradas 10000 y menores

Utilice el comando sed para buscar en archivos de texto entradas 10000 y menores

Estoy intentando usar el sedcomando para buscar en un archivo todas las entradas 10000 y menores, pero creo que esta sedcadena de búsqueda incompleta podría ser para las entradas 10000 y superiores:

sed -n "/[0-9][0-9][0-9][0-9][0-9]/ q" logfile

Respuesta1

También puedes hacerlo usando el siguiente método:

$ sed -n "/^[0-9]\{0,4\}$\|10000/p" logfile

Ejemplo

Digamos que tengo un archivo de muestra, logfileasí:

$ seq 9900 10050  | sed 's/$/ /' > logfile

Esto da como resultado que el archivo logfilese vea así:

$ head -5 logfile 
9900
9901
9902
9903
9904

$ tail -5 logfile 
10046
10047
10048
10049
10050

Hay un espacio al final de cada una de estas líneas gracias a la sed 's/$/ /'línea de arriba cuando creamos el archivo de muestra.

Ahora, cuando ejecutamos el sedcomando anterior:

$ sed -n "/^[0-9]\{1,4\}[^0-9]\|10000/p" logfile  | tail -5
9996 
9997 
9998 
9999 
10000 

Obtenemos todo hasta 10000 y nada más.

Cómo funciona

Lo anterior sedfunciona buscando líneas que comiencen con un rango de dígitos, del 0 al 9, con una longitud que va del 1 al 4. La notación to sedrealiza "/^[0-9]\{1,4\}[^0-9]esta parte. La notación [^0-9]al final dice caracteres que no son del 0 al 9. Esto evita sedque coincidan subcadenas en números que son más largos.

Coincide \|10000con 10000 ya que es un patrón único en comparación con el resto de las cadenas. El final pindica sedque se imprima los resultados.

Usando grep como alternativa

El uso de sedno es realmente la herramienta adecuada para realizar búsquedas. Probablemente sea mejor que lo utilices greppara esto.

$ grep "\b\([0-9]\{1,4\}\|10000\)\b" logfile | head -5
9900 
9901 
9902 
9903 
9904 

$ grep "\b\([0-9]\{1,4\}\|10000\)\b" logfile | tail -5
9996 
9997 
9998 
9999 
10000 

Lo anterior encontrará todas las líneas que contengan una cadena de dígitos de 10000 o menos. Denota \bun borde antes o después de la cadena.

Respuesta2

Perl puede hacer esto más fácil y legible:

perl -nE 'say for grep { $_ <= 10_000 } /([0-9]+)/g' your_file

Respuesta3

sed '/[0-9]/!d;/10000/q' <log.file

Siempre que las entradas estén en orden secuencial, solo necesita especificar que la línea contenga un número; !de lo contrario, delimínela. Y cuando llegues a la fila 10000te quit. Pero todavía se imprime 10000; será la última línea impresa.

Esto también sería mucho mejor si pudieras anclarlo, tal vez al principio de la línea como:

sed '/^[0-9]/!d;/^10000/q' <log.file

Lo cual sería algo más seguro y más rápido.

Pero, como señala slm, grepsería más rápido.

Respuesta4

sed -nr "/0|[1-9][0-9]?[0-9]?[0-9]?[0-9]?/p" logfile

información relacionada