J'essaie de compter /
dans un certain chemin, mais grep
compte toutes les instances comme 1 lorsqu'il se trouve sur 1 ligne.
/home/usr/bin/test | grep / -c
donne une réponse 1
.
Votre commande compterait réellement le nombre de lignes contenant /
dans le sortie standard de commande/home/usr/bin/test
Voici quelques options pour compter les instances de /
dans string/home/usr/bin/test
:
grep -o '/' <<< "/home/usr/bin/test" | wc -l
tr -dc '/' <<< "/home/usr/bin/test" | wc -c
As grep -c
compte le nombre de lignes contenant le motif. L'utilisation de l'option -o
génère un contenu correspondant sur différentes lignes. Vous pouvez ensuite utiliser -c
pour compter ces lignes.
grep -o '/' <<< "/home/usr/bin/test" | grep '/' -c
Utilisation de awk
(Imprimez chaque ligne séparément):
awk -F"/" '{print NF-1}' my.txt
-F"/"
: considère /
comme délimiteurs de champsNF-1
: nombre de champs-1.Imprimer toutes les lignes:
tr -d '\n' < my.txt | awk -F"/" '{print NF-1}'
Utilisation de sed
et grep
:
sed "s@/@/\n@g" my.txt | grep -c /
sed "s@/@/\n@g"
insère une nouvelle ligne après chaque /
afin que grep
puisse tous les compter.Vous le faites mal parce que:
-c
flag compte le nombre de lignes correspondantes"/home/usr/bin/test | grep / -c
signifie littéralement que vous essayez d'exécuter le fichier /home/usr/bin/test
et de diriger sa sortie sur grep
name__Ce que vous devriez faire est ceci:
compter la sortie individuelle de grep
avec
grep -o '/' <<< "/home/usr/bin/test" | wc -l
utilisez des outils autres que grep
name__:
# saving matches to array and printing array in scalar context
$ Perl -ne '@arr = $_ =~ /\//g;print 0+@arr' <<< "/home/usr/bin/test"
4
# building list of only / chars and getting length of that list
$ python -c 'import sys; print(len([char for line in sys.stdin for char in line if char == "/"]))' <<< "/home/usr/bin/test"
4
# iterating over each character of string using substr
$ awk '{for(i=1;i<=length($0);i++) if(substr($0,i,1)=="/") count++}END{print count}' <<< "/home/usr/bin/test"
4