
Estoy intentando usar el sed
comando para buscar en un archivo todas las entradas 10000 y menores, pero creo que esta sed
cadena 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, logfile
así:
$ seq 9900 10050 | sed 's/$/ /' > logfile
Esto da como resultado que el archivo logfile
se 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 sed
comando 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 sed
funciona 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 sed
realiza "/^[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 sed
que coincidan subcadenas en números que son más largos.
Coincide \|10000
con 10000 ya que es un patrón único en comparación con el resto de las cadenas. El final p
indica sed
que se imprima los resultados.
Usando grep como alternativa
El uso de sed
no es realmente la herramienta adecuada para realizar búsquedas. Probablemente sea mejor que lo utilices grep
para 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 \b
un 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, d
elimínela. Y cuando llegues a la fila 10000
te q
uit. 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, grep
sería más rápido.
Respuesta4
sed -nr "/0|[1-9][0-9]?[0-9]?[0-9]?[0-9]?/p" logfile