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