web-dev-qa-db-fra.com

Compter les occurrences de modèle à l'aide de grep

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.

4
Guy . D

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
4
steeldriver

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
4
Gangesh

Utilisation de awk (Imprimez chaque ligne séparément):

awk -F"/" '{print NF-1}' my.txt
  • -F"/": considère / comme délimiteurs de champs
  • NF-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.
3
Ravexina

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 grepname__

Ce que vous devriez faire est ceci:

  • compter la sortie individuelle de grepavec

    grep -o '/'  <<< "/home/usr/bin/test" | wc -l          
    
  • utilisez des outils autres que grepname__:

     # 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
    
2