Примеры экземпляров экземпляров с использованием grep

4

Я пытаюсь подсчитать / по определенному пути, но grep подсчитывает все экземпляры как 1, когда он находится в 1 строке.

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

дает ответ 1 .

    
задан Guy . D 13.05.2017 в 17:36
источник

4 ответа

4

Ваша команда фактически подсчитает количество строк , содержащих / , в стандартном выходе команды /home/usr/bin/test

Вот несколько опций для подсчета экземпляров / в строке /home/usr/bin/test :

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

tr -dc '/' <<< "/home/usr/bin/test" | wc -c
    
ответ дан steeldriver 13.05.2017 в 17:51
источник
4

Как grep -c подсчитывает количество строк, содержащих шаблон. Использование опции -o выводит согласованное содержимое на разные строки. Затем вы можете использовать -c для подсчета этих строк.

grep -o '/' <<< "/home/usr/bin/test" |  grep '/' -c
    
ответ дан Gangesh 13.05.2017 в 18:56
3

Использование awk (печать каждой строки отдельно):

awk -F"/" '{print NF-1}' my.txt
  • -F"/" : считать / в качестве разделителей полей
  • NF-1 : количество полей-1.

Распечатайте все строки:

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

Использование sed и grep :

sed "[email protected]/@/\[email protected]" my.txt | grep -c /
  • sed "[email protected]/@/\[email protected]" добавляет новую строку после каждого / , поэтому grep может считать все из них.
ответ дан Ravexina 13.05.2017 в 18:22
2

Вы делаете это неправильно, потому что:

  • -c flag подсчитывает количество соответствующих строк
  • "/home/usr/bin/test | grep / -c буквально означает, что вы пытаетесь выполнить файл /home/usr/bin/test и вывести его вывод на grep

Что вы должны делать, так это:

  • рассчитывать индивидуальный выход grep с помощью

    grep -o '/'  <<< "/home/usr/bin/test" | wc -l          
    
  • используйте инструменты, отличные от grep :

     # saving matches to array and printing array in scalar context
     $ perl -ne '@arr = $_ =~ /\//g;print [email protected]' <<< "/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
    
ответ дан Sergiy Kolodyazhnyy 13.05.2017 в 19:41