Comment compter les lignes dans un document?


1078

J'ai des lignes comme celles-ci, et je veux savoir combien de lignes j'ai réellement ...

09:16:39 AM  all    2.00    0.00    4.00    0.00    0.00    0.00    0.00    0.00   94.00
09:16:40 AM  all    5.00    0.00    0.00    4.00    0.00    0.00    0.00    0.00   91.00
09:16:41 AM  all    0.00    0.00    4.00    0.00    0.00    0.00    0.00    0.00   96.00
09:16:42 AM  all    3.00    0.00    1.00    0.00    0.00    0.00    0.00    0.00   96.00
09:16:43 AM  all    0.00    0.00    1.00    0.00    1.00    0.00    0.00    0.00   98.00
09:16:44 AM  all    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
09:16:45 AM  all    2.00    0.00    6.00    0.00    0.00    0.00    0.00    0.00   92.00

Existe-t-il un moyen de les compter tous à l'aide des commandes Linux?


4
Ouvrez le fichier en utilisant vim, puis tapez g <Ctrl-g>, il vous montrera le nombre de lignes, de mots, de colonnes et d'octets
Luv33preet

31
@ Luv33preet alors vous vous retrouvez juste sur SO, en cherchant comment quitter vim
Skylar Ittner

5
@SkylarIttner Et si vous avez besoin de chercher comment quitter vim, <esc> :q!c'est la seule réponse. (Ceci est une blague, cela supprimera toutes les modifications non enregistrées - la blague étant que si vous ne connaissez pas vim, il est facile de gâcher un fichier, il vaut donc mieux ne pas l'enregistrer).
Ryan

Réponses:


2032

Utilisation wc:

wc -l <filename>

Cela produira le nombre de lignes dans <filename>:

$ wc -l /dir/file.txt
3272485 /dir/file.txt

Ou, pour omettre <filename>le résultat, utilisez wc -l < <filename>:

$ wc -l < /dir/file.txt
3272485

Vous pouvez également diriger des données vers wc:

$ cat /dir/file.txt | wc -l
3272485
$ curl yahoo.com --silent | wc -l
63

18
c'est bien!! vous pouvez utiliser awk pour vous débarrasser du nom de fichier ajouté au numéro de ligne en tant que tel:wc -l <file> | awk '{print $1}
CheeHow

80
Encore plus court, vous pourriez le fairewc -l < <filename>
Tensigh

5
@ GGB667, vous pouvez également vous débarrasser du nom de fichier aveccat <file> | wc -l
baptx

14
et watch wc -l <filename>vous pouvez suivre ce fichier en temps réel. C'est utile pour les fichiers journaux par exemple.
DarkSide

27
Attention, wc -l compte les "nouvelles lignes". Si vous avez un fichier avec 2 lignes de texte et un symbole "nouvelle ligne" entre elles, wc affichera "1" au lieu de "2".
Konstantin

140

Pour compter toutes les lignes, utilisez:

$ wc -l file

Pour filtrer et compter uniquement les lignes avec motif, utilisez:

$ grep -w "pattern" -c file  

Ou utilisez -v pour inverser la correspondance:

$ grep -w "pattern" -c -v file 

Consultez la page de manuel grep pour jeter un œil aux arguments -e, -i et -x ...


Curieusement, parfois, grep -cça marche mieux pour moi. Principalement en raison du wc -lpréfixe d'espace de remplissage ennuyeux de «fonctionnalité».
MarkHu


43

il y a plusieurs façons. utiliser wcest un.

wc -l file

d'autres incluent

awk 'END{print NR}' file

sed -n '$=' file (GNU sed)

grep -c ".*" file

3
Oui, mais wc -l filevous donne le nombre de lignes ET le nom de fichier pour obtenir uniquement le nom de fichier que vous pouvez faire:filename.wc -l < /filepath/filename.ext
ggb667

L'utilisation de l'argument GNU grep -H renvoie le nom de fichier et le nombre. grep -Hc ".*" file
Zlemini

J'ai voté cette solution car elle wc -lcompte les caractères de nouvelle ligne et non les lignes réelles dans un fichier. Toutes les autres commandes incluses dans cette réponse vous donneront le bon numéro au cas où vous auriez besoin des lignes.
growlingchaos

27

L'outil wcest le "compteur de mots" dans les systèmes d'exploitation UNIX et UNIX, mais vous pouvez également l'utiliser pour compter les lignes dans un fichier en ajoutant l' -loption.

wc -l foocomptera le nombre de lignes foo. Vous pouvez également diriger la sortie d'un programme comme celui- ls -l | wc -lci:, qui vous indiquera le nombre de fichiers dans le répertoire actuel (plus un).


3
ls -l | wc -l vous donnera en fait le nombre de fichiers dans le répertoire +1 pour la ligne de taille totale. vous pouvez faire ls -ld * | wc -lpour obtenir le nombre correct de fichiers.
Joshua Lawrence Austill

24

Si vous souhaitez vérifier la ligne totale de tous les fichiers d'un répertoire, vous pouvez utiliser find et wc:

find . -type f -exec wc -l {} +


15

Si tout ce que vous voulez, c'est le nombre de lignes (et non le nombre de lignes et le stupide nom de fichier qui revient):

wc -l < /filepath/filename.ext

Comme mentionné précédemment, ceux-ci fonctionnent également (mais sont inférieurs pour d'autres raisons):

awk 'END{print NR}' file       # not on all unixes
sed -n '$=' file               # (GNU sed) also not on all unixes
grep -c ".*" file              # overkill and probably also slower

3
Cette réponse a été publiée 3 ans après la question et il s'agit simplement d'en copier d'autres. La première partie est triviale et la seconde est la réponse de ghostdog . Downvoting.
fedorqui 'SO arrêtez de nuire'

4 ans après. Downvoting. Voyons voir si nous pouvons obtenir une séquence de dix années de downvote!
Damien Roche

1
Non tu as tort; La réponse de ghostdog ne répond pas à la question d'origine. Il vous donne le nombre de lignes ET le nom de fichier. Pour obtenir uniquement le nom de fichier, vous pouvez faire: filename.wc -l </filepath/filename.ext. C'est pourquoi j'ai posté la réponse. awk, sed et grep sont tous des façons légèrement inférieures de le faire. La bonne façon est celle que j'ai énumérée.
ggb667

8

Utilisez nlcomme ceci:

nl filename

De man nl:

Écrivez chaque FICHIER sur la sortie standard, avec des numéros de ligne ajoutés. Sans FICHIER, ou lorsque FICHIER est -, lisez l'entrée standard.


C'est la première réponse que j'ai trouvée qui fonctionne avec un fichier qui a une seule ligne de texte qui ne se termine pas par une nouvelle ligne, qui wc -lindique 0. Merci.
Scott Joudry

7

J'utilise ceci:

cat myfile.txt | wc -l

Je le préfère à la réponse acceptée car il n'imprime pas le nom de fichier, et vous n'avez pas besoin de l'utiliser awkpour corriger cela. Réponse acceptée:

wc -l myfile.txt

Mais je pense que le meilleur est la réponse du GGB667:

wc -l < myfile.txt

Je vais probablement l'utiliser à partir de maintenant. C'est un peu plus court que moi. Je mets en place mon ancienne façon de le faire au cas où quelqu'un le préférerait. La sortie est la même avec ces deux méthodes.


3
la première et la dernière méthode sont les mêmes. le dernier est meilleur car il ne

5

Ci-dessus sont la méthode préférée mais la commande "cat" peut également être utile:

cat -n <filename>

Vous montrera tout le contenu du fichier avec des numéros de ligne.


5

J'ai vu cette question pendant que je cherchais un moyen de compter plusieurs lignes de fichiers, donc si vous voulez compter plusieurs lignes de fichier d'un fichier .txt, vous pouvez le faire,

cat *.txt | wc -l

il s'exécutera également sur un fichier .txt;)


5

wc -l ne compte pas les lignes.

Oui, cette réponse peut être un peu tardive pour le parti, mais je n'ai encore trouvé personne documentant une solution plus robuste dans les réponses.

Contrairement à la croyance populaire, POSIX ne nécessite aucun fichier se terminant par un caractère de nouvelle ligne. Oui, la définition d'une ligne POSIX 3.206 est la suivante:

Une séquence de zéro ou plusieurs caractères non <nouvelle> plus un caractère de fin.

Cependant, ce que beaucoup de gens ignorent, c'est que POSIX définit également la ligne incomplète POSIX 3.195 comme suit :

Une séquence d'un ou plusieurs caractères non <nouvelle> à la fin du fichier.

Par conséquent, les fichiers sans suivi LFsont parfaitement conformes à POSIX.

Si vous choisissez de ne pas prendre en charge les deux types d'EOF, votre programme n'est pas compatible POSIX.

À titre d'exemple, regardons le fichier suivant.

1 This is the first line.
2 This is the second line.

Peu importe l'EOF, je suis sûr que vous conviendrez qu'il y a deux lignes. Vous avez compris cela en regardant combien de lignes ont été commencées, pas en regardant combien de lignes ont été terminées. En d'autres termes, selon POSIX, ces deux fichiers ont tous deux la même quantité de lignes:

1 This is the first line.\n
2 This is the second line.\n
1 This is the first line.\n
2 This is the second line.

La page de manuel est relativement claire sur le wccomptage des sauts de ligne, un saut de ligne n'étant qu'un 0x0acaractère:

NAME
       wc - print newline, word, and byte counts for each file

Par conséquent, wcn'essaye même pas de compter ce que vous pourriez appeler une "ligne". Utiliser wcpour compter les lignes peut très bien conduire à des erreurs de comptage, selon l'EOF de votre fichier d'entrée.

Solution compatible POSIX

Vous pouvez utiliser greppour compter les lignes comme dans l'exemple ci-dessus. Cette solution est à la fois plus robuste et précise, et elle prend en charge toutes les différentes saveurs de ce que pourrait être une ligne de votre fichier:

$ grep -c ^ FILE

4
cat file.log | wc -l | grep -oE '\d+'
  • grep -oE '\d+': Afin de renvoyer les chiffres uniquement .


3

La redirection / canalisation de la sortie du fichier vers wc -ldevrait suffire, comme suit:

cat /etc/fstab | wc -l

qui fournirait alors le non. de lignes uniquement.


3

Ou comptez toutes les lignes des sous-répertoires avec un modèle de nom de fichier (par exemple, les fichiers journaux avec des horodatages dans le nom du fichier):

wc -l ./**/*_SuccessLog.csv

2

Je sais que c'est vieux mais quand même: compte les lignes filtrées

Mon fichier ressemble à:

Number of files sent
Company 1 file: foo.pdf OK
Company 1 file: foo.csv OK
Company 1 file: foo.msg OK
Company 2 file: foo.pdf OK
Company 2 file: foo.csv OK
Company 2 file: foo.msg Error
Company 3 file: foo.pdf OK
Company 3 file: foo.csv OK
Company 3 file: foo.msg Error
Company 4 file: foo.pdf OK
Company 4 file: foo.csv OK
Company 4 file: foo.msg Error

Si je veux savoir combien de fichiers sont envoyés, OK:

grep "OK" <filename> | wc -l

OU

grep -c "OK" filename

2

compter le nombre de lignes et stocker le résultat en variable utilisez cette commande:

count=$(wc -l < file.txt) echo "Number of lines: $count"


1

Comme d'autres l'ont dit, wc -lc'est la meilleure solution, mais pour référence future, vous pouvez utiliser Perl:

perl -lne 'END { print $. }'

$.contient le numéro de ligne et le ENDbloc s'exécutera à la fin du script.


1
Ne fonctionne pas:dir | perl -lne 'END { print $. }' Can't find string terminator "'" anywhere before EOF at -e line 1.'
VeikkoW

1
@VeikkoW fonctionne pour moi. Si vous êtes sous Windows, différentes règles de cotation s'appliquent; mais l'OP a posé des questions sur Linux / Bash.
tripleee du

1
perl -lne '}{ print $. 'fait de même.
Tom Fenech


1

wc -l <filename>

Cela vous donnera le nombre de lignes et le nom de fichier en sortie.

Par exemple.

wc -l 24-11-2019-04-33-01-url_creator.log

Production

63 24-11-2019-04-33-01-url_creator.log

Utilisation

wc -l <filename>|cut -d\ -f 1

pour obtenir uniquement le nombre de lignes en sortie.

Par exemple.

wc -l 24-11-2019-04-33-01-url_creator.log|cut -d\ -f 1

Production

63


Où est l'avantage de répéter la réponse acceptée (dix ans)?
jeb

Parce que je n'ai pas pu trouver de commande pour obtenir uniquement les numéros de ligne en sortie dans ce fil.
Harsh Sarohi

C'est le deuxième exemple de la réponse acceptée. wc -l < filename
jeb

wc -l <nom de fichier> donne le nom de fichier ainsi que le nombre de lignes en sortie.
Harsh Sarohi

Non, wc -l < filenameest différent de wc -l filename, le premier utilise la redirection et puis il n'y a pas de nom de fichier dans la sortie, comme indiqué dans la réponse de user85509
jeb

1

Cette fonction de shell portable amovible [ℹ]   fonctionne comme un charme. Ajoutez simplement l'extrait suivant à votre .bashrcfichier (ou l'équivalent pour votre environnement shell) .

# ---------------------------------------------
#  Count lines in a file
#
#  @1 = path to file
#
#  EXAMPLE USAGE: `count_file_lines $HISTFILE`
# ---------------------------------------------
count_file_lines() {
    local subj=$(wc -l $1)
    subj="${subj//$1/}"
    echo ${subj//[[:space:]]}
}

Cela devrait être entièrement compatible avec tous les shells compatibles POSIX en plus de bash et zsh .

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.