Qu'est-ce qu'une commande Unix pour supprimer les N premiers caractères d'une ligne?

238

Par exemple, je pourrais vouloir:

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

Je pensais que cela trpourrait avoir la capacité de le faire, mais je ne suis pas sûr.

les2
la source

Réponses:

355

Utilisez cut. Par exemple. pour supprimer les 4 premiers caractères de chaque ligne (c'est-à-dire commencer au 5ème caractère):

tail -f logfile | grep org.springframework | cut -c 5-
Iammichael
la source
1
avez-vous une idée de pourquoi le tuyau ne fonctionne pas? quand j'exécute essentiellement cette commande, 'cut' n'imprime pas les résultats sur stdout ... si je lance juste 'tail -f logfile | cut -c 5- 'je peux voir les résultats ... le problème doit être avec grep
j'utilise
que se passe-t-il si vous n'ajoutez pas le dernier tuyau et coupez? en gros, si vous supprimez la dernière partie de la ligne?
LB40
il "met en file d'attente" le fichier journal, le filtre avec grep (c'est-à-dire que toutes les lignes contenant "org.springframework" sont imprimées sur stdout) lorsque j'ajoute le tuyau à "couper" ... il se bloque cependant, si j'élimine 'grep' la 'coupe' fonctionne correctement ... je pense que quelque chose ne va pas avec la façon dont
j'utilise
1
oh je vois ... pourquoi utilisez-vous la queue? faites juste grep org.springframework logfile | cut -c 5- mais je pense que sed est plus agréable :-)
LB40
6
Le problème est que grep met en mémoire tampon de gros morceaux avant de les envoyer à couper car il peut voir qu'il n'écrit pas sur un terminal. Utilisez grep --line-buffered "org.springframeworkpour résoudre ce problème.
Steen Schütt
48
sed 's/^.\{5\}//' logfile 

et vous remplacez 5 par le nombre que vous voulez ... ça devrait faire l'affaire ...

MODIFIER si pour chaque ligne sed 's/^.\{5\}//g' logfile

LB40
la source
29

Vous pouvez utiliser cut:

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

-c: personnages

file.txt: fichier d'entrée

new_file.txt: fichier de sortie

N-: Les caractères de N à la fin doivent être coupés et sortis dans le nouveau fichier.

Peut également avoir d'autres arguments comme: «N», «N-M», «-M» signifiant respectivement le nième caractère, le nième au mième caractère, le premier au mième caractère.

Cela effectuera l'opération sur chaque ligne du fichier d'entrée.

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

supprimerait les 900 premiers caractères

cut utilise 900- pour afficher le 900ème caractère à la fin de la ligne

mais quand je passe tout cela à travers grep, je ne reçois rien

les2
la source
4
"cut -c 1-900" ne "supprimera pas les 900 premiers caractères" - il ne laissera que les 900 premiers caractères. Si vous souhaitez supprimer les 900 premiers caractères, utilisez "cut -c 901-"
iammichael
c'est aussi 900 premiers caractères sur chaque ligne, selon la réponse de @ iammichael
Blair Conrad
1
'cut -c 900- "supprimera les 899 premiers caractères, non?
Yiding Zhou
4

Je pense que ce awkserait le meilleur outil pour cela car il peut à la fois filtrer et exécuter les fonctions de manipulation de chaînes nécessaires sur les lignes filtrées:

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

ou

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

Voici une fonction simple, testée en bash. Le premier paramètre de la fonction est une chaîne, le deuxième paramètre est le nombre de caractères à supprimer

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

Usage: entrez la description de l'image ici

À Kra
la source
2
vous pouvez simplifier cela pour faire écho à $ {1: $ 2}
kdubs le