¿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.

les2
fuente

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-
soy Michael
fuente
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

LB40
fuente
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.

Ankur
fuente
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

les2
fuente
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)'
John B
fuente
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í

A Kra
fuente
2
puede simplificar esto para hacer eco de $ {1: $ 2}
kdubs