bash echo nombre de lignes de fichier données dans une variable bash sans le nom du fichier

J’ai les trois constructions suivantes dans un script bash:

NUMOFLINES=$(wc -l $JAVA_TAGS_FILE) echo $NUMOFLINES" lines" echo $(wc -l $JAVA_TAGS_FILE)" lines" echo "$(wc -l $JAVA_TAGS_FILE) lines" 

Et ils produisent tous deux une sortie identique lorsque le script est exécuté:

 121711 /home/slash/.java_base.tag lines 121711 /home/slash/.java_base.tag lines 121711 /home/slash/.java_base.tag lines 

C’est-à-dire que le nom du fichier est également répercuté (ce que je ne veux pas). Pourquoi ces scripts échouent et comment dois-je générer un nettoyage:

 121711 lines 

?

    Un exemple d’utilisation de vos propres données

    Vous pouvez éviter que votre nom de fichier soit incorporé dans la variable NUMOFLINES en utilisant la redirection de JAVA_TAGS_FILE , plutôt que de transmettre le nom de fichier en tant qu’argument à wc . Par exemple:

     NUMOFLINES=$(wc -l < "$JAVA_TAGS_FILE") 

    Explication: utilisez des canaux ou une redirection pour éviter les noms de fichiers dans la sortie

    L'utilitaire wc n'imprimera pas le nom du fichier dans sa sortie si l'entrée provient d'un opérateur de canal ou de redirection. Considérez ces différents exemples:

     # wc shows filename when the file is an argument $ wc -l /etc/passwd 41 /etc/passwd # filename is ignored when piped in on standard input $ cat /etc/passwd | wc -l 41 # unusual redirection, but wc still ignores the filename $ < /etc/passwd wc -l 41 # typical redirection, taking standard input from a file $ wc -l < /etc/passwd 41 

    Comme vous pouvez le voir, le seul moment où nous imprimons le nom de fichier est quand il est passé en argument, plutôt que comme donnée sur une entrée standard. Dans certains cas, vous souhaiterez peut-être que le nom du fichier soit imprimé, il est donc utile de comprendre quand il sera affiché.

    Vous ne pouvez pas obtenir le nom du fichier si vous ne lui en donnez pas.

     wc -l < "$JAVA_TAGS_FILE" 

    Vous pouvez également utiliser awk:

    awk 'END {print NR,"lines"}' filename

    Ou

    awk 'END {print NR}' filename

    (appliquer sur Mac, et probablement sur d’autres Unix)

    En fait, il y a un problème avec l’approche wc: elle ne compte pas la dernière ligne si elle ne se termine pas par le symbole de fin de ligne.

    Utilisez ceci à la place

     nbLines=$(cat -n file.txt | tail -n 1 | cut -f1 | xargs) 

    ou même mieux (merci gniourf_gniourf):

     nblines=$(grep -c '' file.txt) 

    Note: L’approche awk de chilicuil fonctionne également.

    C’est très simple:

     NUMOFLINES=$(cat $JAVA_TAGS_FILE | wc -l ) 

    ou

     NUMOFLINES=$(wc -l $JAVA_TAGS_FILE | awk '{print $1}') 

    J’utilise normalement la fonctionnalité ‘back tick’ de bash

     export NUM_LINES=`wc -l filename` 

    Notez que la coche est la dernière coche, par exemple, pas la citation simple normale