¿Qué es un comando unix para eliminar los primeros N caracteres de una línea?


238

Por ejemplo, podría querer:

tail -f logfile | grep org.springframework | <command to remove first N characters>

Estaba pensando que trpodría tener la capacidad de hacer esto, pero no estoy seguro.

Respuestas:


355

Uso cut. P.ej. para quitar los primeros 4 caracteres de cada línea (es decir, comenzar en el 5 ° carácter):

tail -f logfile | grep org.springframework | cut -c 5-

1
¿Tienes alguna idea de por qué la tubería no funciona? cuando ejecuto esencialmente ese comando, 'cortar' no imprime los resultados en stdout ... si solo ejecuto 'tail -f logfile | cut -c 5- 'puedo ver los resultados ... el problema debe estar con grep estoy usando cygwin FYI gracias
— les2

¿Qué sucede si no agrega la última tubería y corta? básicamente, si eliminas la última parte de la línea?
— LB40

"sigue" el archivo de registro, filtrándolo con grep (es decir, todas las líneas con "org.springframework" en ellas están impresas en stdout) cuando agrego la tubería a 'cortar' ... se cuelga SIN EMBARGO, si elimino 'grep' el 'corte' funciona correctamente ... estoy pensando mal de algo con lo que estoy usando grep ... podría ser una cosa demasiado cygwin
— les2

1
oh ya veo ... ¿por qué usas cola? simplemente haga grep org.springframework logfile | corté -c 5- pero yo creo que sed es más agradable :-)
— LB40

66
El problema es que grep está almacenando grandes fragmentos antes de enviarlos a cortar porque puede ver que no está escribiendo en un terminal. Úselo grep --line-buffered "org.springframeworkpara resolver ese problema.
— Steen Schütt

48
sed 's/^.\{5\}//' logfile 

y reemplazas 5 por el número que deseas ... debería hacer el truco ...

EDITAR si para cada línea sed 's/^.\{5\}//g' logfile


29

Puedes usar cut:

cut -c N- file.txt > new_file.txt

-c: caracteres

file.txt: fichero de entrada

new_file.txt: archivo de salida

N-: Caracteres desde N hasta el final para cortar y enviar al nuevo archivo.

También puede tener otros argumentos como: 'N', 'N-M', '-M' que significa enésimo carácter, enésimo a enésimo carácter, primero a enésimo carácter respectivamente.

Esto realizará la operación en cada línea del archivo de entrada.


4
tail -f logfile | grep org.springframework | cut -c 900-

eliminaría los primeros 900 caracteres

cut usa 900- para mostrar el carácter 900 al final de la línea

sin embargo, cuando canalizo todo esto a través de grep, no consigo nada


44
"cut -c 1-900" no "eliminará los primeros 900 caracteres", solo dejará los primeros 900 caracteres. Si desea eliminar los primeros 900 caracteres, use "cut -c 901-"
— iammichael

también son los primeros 900 caracteres en cada línea, según la respuesta de @ iammichael
— Blair Conrad

1
'cut -c 900- "eliminará los primeros 899 caracteres, ¿no?
— Yiding Zhou

4

Creo que awksería la mejor herramienta para esto, ya que puede filtrar y realizar las funciones de manipulación de cadenas necesarias en las líneas filtradas:

tail -f logfile | awk '/org.springframework/ {print substr($0, 6)}'

o

tail -f logfile | awk '/org.springframework/ && sub(/^.{5}/,"",$0)'

1

Aquí hay una función simple, probada en bash. El primer parámetro de la función es una cadena, el segundo parámetro es el número de caracteres que se eliminarán

function stringStripNCharsFromStart { echo ${1:$2:${#1}} }

Uso: ingrese la descripción de la imagen aquí


2
puede simplificar esto para hacer eco de $ {1: $ 2}
— kdubs
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.