Aller au contenu principal
~/GiwiSoft
Cropped 6UHHE19YG7

Connaître le nombre de lignes d’un fichier

Giwi 2 min de lecture Linux

Vous souhaitez savoir le nombre de ligne d’un fichier?

cat monfichier.txt | wc -l
wc -l monfichier.txt

Mais quand le fichier est monstrueux, c’est la misère, voici un script qui permet de faire une estimation :

# wcle – word count line estimate
# Fast line-count estimate for huge files
file=$1
nsample=1000
headbytes=`head -q -n $nsample $file | wc -c`
#tailbytes=`tail -q -n $nsample $file | wc -c`
filesize=`ls -sH --block-size=1 $file | cut -f1 -d" "`
echo -n $((filesize / (headbytes) * $nsample))
echo " (" $((filesize / headbytes )) "K;" $((filesize / headbytes /1000 )) "M )"
./wcle.sh mon-gros-fichier.txt

Compter les lignes de plusieurs fichiers à la fois

wc accepte plusieurs fichiers et affiche un total :

$ wc -l fichier1.txt fichier2.txt fichier3.log
$ wc -l *.txt # tous les .txt du dossier
$ wc -l src/**/*.py # tous les fichiers Python (si glob activé)

Compter récursivement avec find

Pour compter toutes les lignes d’un projet entier :

$ find . -name "*.py" -exec wc -l {} + | tail -1
$ find . -type f -name "*.c" -o -name "*.h" | xargs wc -l | tail -1

Sans le tail -1, vous voyez le détail fichier par fichier.

Compter uniquement les lignes de code (hors commentaires et lignes vides)

Avec grep :

$ grep -cve '^\s*$' -e '^\s*//' -e '^\s*#' monfichier.c

Pour un projet entier :

$ find . -name "*.py" -exec grep -cve '^\s*$' -e '^\s*#' {} + | awk -F: '{s+=$2} END {print s}'

Statistiques de code avec cloc

Pour un rapport complet (lignes de code, commentaires, vides par langage) :

$ sudo apt install cloc
$ cloc /chemin/vers/mon/projet

Exemple de sortie :

Language    Files   Code  Comment  Blank
Python 12 1250 340 210
JavaScript 5 890 120 95

Méthodes rapides pour fichiers énormes

Quand le fichier est vraiment monstrueux et que wc -l prend trop de temps :

  • Estimation par échantillonnage (script wcle.sh ci-dessus). La précision dépend de l’homogénéité du fichier.
  • Utiliser awk : plus rapide que cat | wc -l car pas de pipe :
$ awk 'END {print NR}' mon-gros-fichier.txt
  • Compter les retours à la ligne dans un fichier binaire ou une sauvegarde :
$ tr -cd '\n' < mon-fichier | wc -c

Pour les fichiers de plusieurs Go, privilégiez toujours wc -l sans cat : c’est déjà l’outil le plus optimisé de votre système.`