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.

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-

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


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.


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


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)'

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


2
vous pouvez simplifier cela pour faire écho à $ {1: $ 2}
— kdubs le
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.