web-dev-qa-db-fra.com

bash echo nombre de lignes du fichier donné 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. le nom du fichier est également répercuté (ce que je ne veux pas). Pourquoi ces scriplets échouent-ils et comment devrais-je produire un clean:

121711 lines

?

78

Un exemple d'utilisation de vos propres données

Vous pouvez éviter d'avoir votre nom de fichier incorporé dans la variable NUMOFLINES en utilisant la redirection à partir 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: Utiliser des tubes ou une redirection pour éviter les noms de fichiers en 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 constater, le seul moment wc imprimera le nom du fichier, c’est lorsqu’il sera transmis en tant qu’argument, plutôt que comme donnée sur une entrée standard. Dans certains cas, vous pouvez souhaiter que le nom de fichier soit imprimé. Il est donc utile de comprendre quand il sera affiché.

147
Todd A. Jacobs

wc ne peut pas obtenir le nom du fichier si vous ne le lui donnez pas.

wc -l < "$Java_TAGS_FILE"
15

Vous pouvez aussi utiliser awk:

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

Ou

awk 'END {print NR}' filename

12
Javier López

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

En réalité, il existe un problème avec l'approche wc: la dernière ligne n'est pas comptée 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)

Remarque: l'approche awk par chilicuil fonctionne également.

5
ling

C'est très simple:

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

ou

NUMOFLINES=$(wc -l $Java_TAGS_FILE | awk '{print $1}')
3
Slava Semushin