GNU/Linux >> Tutoriels Linux >  >> Linux

Comment tronquer un fichier par lignes ?

Le sed approche est bien, mais boucler sur toutes les lignes ne l'est pas. Si vous savez combien de lignes vous voulez conserver (pour avoir un exemple, j'utilise 99 ici), vous pouvez le faire comme ceci :

sed -i '100,$ d' myfile.txt

Explication :sed est un processeur d'expressions régulières. Avec l'option -i étant donné, il traite un fichier directement ("en ligne") - au lieu de simplement le lire et d'écrire les résultats sur la sortie standard. 100,$ signifie simplement "de la ligne 100 à la fin du fichier" -- et est suivi de la commande d , que vous avez probablement deviné correctement pour "supprimer". Donc en bref, la commande signifie :"Supprimer toutes les lignes de la ligne 100 à la fin du fichier de monfichier.txt". 100 est la première ligne à supprimer, car vous souhaitez conserver 99 lignes.

Modifier : Si, en revanche, il existe des fichiers journaux dans lesquels vous souhaitez conserver, par ex. le dernier 100 lignes :

[ $(wc -l myfile.txt) -gt 100 ] && sed -i "1,$(($(wc -l myfile.txt|awk '{print $1}') - 100)) d" myfile.txt

Que se passe-t-il ici :

  • [ $(wc -l myfile.txt) -gt 100 ]  :effectuez les opérations suivantes uniquement si le fichier contient plus de 100 lignes
  • $((100 - $(wc -l myfile.txt|awk '{print $1}'))) :calcule le nombre de lignes à supprimer (c'est-à-dire toutes les lignes du fichier sauf les (dernières) 100 à conserver)
  • 1, $((..)) d :supprimer toutes les lignes de la première à la ligne calculée

MODIF : comme la question vient d'être modifiée pour donner plus de détails, j'inclurai également ces informations supplémentaires dans ma réponse. Les faits ajoutés sont :

  • une taille spécifique doit rester avec le fichier (10 000 octets)
  • chaque ligne a une taille spécifique en octets (300 octets dans l'exemple)

A partir de ces données, il est possible de calculer le nombre de lignes à rester comme "/", ce qui avec l'exemple signifierait 33 lignes. Le terme shell pour le calcul :$((size_to_remain / linesize)) (au moins sous Linux utilisant Bash, le résultat est un entier). La commande ajustée se lirait maintenant :

# keep the start of the file (OPs question)
sed -i '34,$ d' myfile.txt
# keep the end of the file (my second example)
[ $(wc -l myfile.txt) -gt 33 ] && sed -i "1,33 d" myfile.txt

Les tailles étant connues à l'avance, plus besoin de calcul intégré au sed commande. Mais pour plus de flexibilité, dans certains scripts shell, on peut utiliser des variables.

Pour un traitement conditionnel basé sur la taille du fichier, on peut utiliser la construction "test" suivante :

[ "$(ls -lk $file | awk ' {print $5}')" -gt 100 ] &&

ce qui signifie :"si la taille de $file dépasse 100 Ko, faites..." (ls -lk répertorie la taille du fichier en Ko à la position 5, d'où awk est utilisé pour extraire exactement ceci).


Linux
  1. Comment supprimer les lignes en double dans un fichier texte ?

  2. Comment ajouter plusieurs lignes à un fichier ?

  3. Compter les lignes dans un fichier ?

  4. Comment utiliser les lignes d'un fichier comme arguments d'une commande ?

  5. Comment couper un fichier à une taille donnée sous Linux ?

Comment tronquer des fichiers (vides) sous Linux

Comment utiliser la commande Truncate sous Linux

Comment imprimer des lignes dupliquées dans un fichier texte sous Linux

Comment mélanger les lignes dans un fichier sous Linux

Comment inverser les lignes d'un fichier par caractère sous Linux

Comment trouver la ou les lignes les plus longues dans un fichier sous Linux