Contar instâncias de padrão usando grep

4

Estou tentando contar / em um determinado caminho, mas grep conta todas as instâncias como 1 quando está em uma linha.

/home/usr/bin/test | grep / -c 

dá uma resposta 1 .

    
por Guy . D 13.05.2017 / 17:36

4 respostas

4

Seu comando realmente contaria o número de linhas contendo / na saída padrão do comando /home/usr/bin/test

Aqui estão algumas opções para contar as instâncias de / na string /home/usr/bin/test :

grep -o '/' <<< "/home/usr/bin/test" | wc -l

tr -dc '/' <<< "/home/usr/bin/test" | wc -c
    
por steeldriver 13.05.2017 / 17:51
4

Como grep -c conta o número de linhas que contêm o padrão. O uso da opção -o gera conteúdo correspondente em linhas diferentes. Você pode usar -c para contar essas linhas.

grep -o '/' <<< "/home/usr/bin/test" |  grep '/' -c
    
por Gangesh 13.05.2017 / 18:56
3

Usando awk (imprima cada linha separadamente):

awk -F"/" '{print NF-1}' my.txt
  • -F"/" : considere / como delimitadores de campo
  • NF-1 : número de campos-1.

Imprimir todas as linhas:

tr -d '\n' < my.txt | awk -F"/" '{print NF-1}'

Usando sed e grep :

sed "s@/@/\n@g" my.txt | grep -c /
  • sed "s@/@/\n@g" coloca uma nova linha após cada / , então grep pode contar todos eles.
por Ravexina 13.05.2017 / 18:22
2

Você está fazendo errado porque:

  • -c flag conta o número de linhas correspondentes
  • "/home/usr/bin/test | grep / -c significa literalmente que você está tentando executar o arquivo /home/usr/bin/test e canalizar sua saída para grep

O que você deve fazer é isto:

  • conta a saída individual de grep com

    grep -o '/'  <<< "/home/usr/bin/test" | wc -l          
    
  • use ferramentas diferentes de grep :

     # 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
    
por Sergiy Kolodyazhnyy 13.05.2017 / 19:41