web-dev-qa-db-fra.com

Comment obtenir "wc -l" pour imprimer uniquement le nombre de lignes sans nom de fichier?

wc -l file.txt

affiche le nombre de lignes et le nom du fichier.

J'ai juste besoin du numéro lui-même (pas le nom du fichier).

Je peux le faire

 wc -l file.txt | awk '{print $1}'

Mais peut-être qu'il y a un meilleur moyen?

115
PoGibas

Essayez de cette façon:

wc -l < file.txt
174
Norman Ramsey
cat file.txt | wc -l

Selon la page de manuel (pour la version BSD, je n'ai pas de version GNU à vérifier):

Si aucun fichier n'est spécifié, l'entrée standard est utilisée et aucun nom de fichier n'est affiché. L'invite acceptera l'entrée jusqu'à ce qu'elle reçoive EOF ou [^ D] dans la plupart des environnements.

19
pjmorse

Pour ce faire sans l'espace principal, pourquoi pas:

wc -l < file.txt | bc
12
Desi Cochrane

Que diriez-vous

wc -l file.txt | cut -d' ' -f1

acheminez la sortie de wc dans cut (où les délimiteurs sont des espaces et ne sélectionnez que le premier champ)

11
Neil Albert

Comparaison des techniques

J'ai eu un problème similaire en essayant d'obtenir un nombre de caractères sans le blanc principal fourni par wc, ce qui m'a conduit à cette page. Après avoir essayé les réponses ici, voici les résultats de mes tests personnels sur Mac (BSD Bash). Encore une fois, cela concerne le nombre de personnages; pour le nombre de lignes, vous feriez wc -l. echo -n omet la fin de ligne.

FOO="bar"
echo -n "$FOO" | wc -c                          # "       3"    (x)
echo -n "$FOO" | wc -c | bc                     # "3"           (√)
echo -n "$FOO" | wc -c | tr -d ' '              # "3"           (√)
echo -n "$FOO" | wc -c | awk '{print $1}'       # "3"           (√)
echo -n "$FOO" | wc -c | cut -d ' ' -f1         # "" for -f < 8 (x)
echo -n "$FOO" | wc -c | cut -d ' ' -f8         # "3"           (√)
echo -n "$FOO" | wc -c | Perl -pe 's/^\s+//'    # "3"           (√)
echo -n "$FOO" | wc -c | grep -ch '^'           # "1"           (x)
echo $( printf '%s' "$FOO" | wc -c )            # "3"           (√)

Je ne m'appuierais pas sur la méthode cut -f* en général, car elle nécessite de connaître le nombre exact d'espaces en tête qu'une sortie donnée peut avoir. Et le grep one fonctionne pour compter les lignes, mais pas les caractères.

bc est le plus concis, et awk et Perl semblent un peu excessifs, mais ils devraient tous être relativement rapides et suffisamment portables.

Notez également que certains d'entre eux peuvent également être adaptés pour réduire l'espace blanc des chaînes générales (ainsi que echo `echo $FOO`, autre astuce intéressante).

4
Beejor

Que diriez-vous

grep -ch "^" file.txt
4
MeIsMich

De toute évidence, il y a beaucoup de solutions à cela. Voici un autre si:

wc -l somefile | tr -d "[:alpha:][:blank:][:punct:]"

Cela ne génère que le nombre de lignes, mais le caractère de fin de ligne (\n) est présent. Si vous ne le souhaitez pas non plus, remplacez [:blank:] par [:space:].

3
Bouchaala Reda

Le meilleur moyen serait d’abord de trouver tous les fichiers dans le répertoire, puis d’utiliser AWK NR (nombre de variables d’enregistrements)

ci-dessous est la commande:

find <directory path>  -type f | awk  'END{print NR}'

exemple: - find /tmp/ -type f | awk 'END{print NR}'

1
user128364