Grep count matches acima de 'X'

3

Estou tentando descobrir um comando que corresponda a todas as contagens acima de certas contagens. Estou usando

grep -src 'Bicycle' /cygdrive/c/Documents/* |grep -v ':0$'

e a saída é:

/cygdrive/c/Documents/blahhh.txt:1
/cygdrive/c/Documents/blahhh.txt:3
/cygdrive/c/Documents/bla0.txt:5
/cygdrive/c/Documents/blahg.txt:23

Mas eu só quero que seja produzido:

/cygdrive/c/Documents/blahg.txt:23

Eu procurei bastante por este. Se alguém pode me levar na direção certa, seria incrível.

    
por Michael Flynn 07.01.2018 / 07:36

3 respostas

5

Uma maneira simples de fazer isso seria canalizar a saída de grep para awk e analisá-la definindo um de-limitador como : e verificar se a última contagem de campos é maior que a X o que você está tentando definir

grep -src 'Bicycle' /cygdrive/c/Documents/* | awk -F: '$NF+0 > 1'

No exemplo acima, tirei a contagem de ocorrências maior que 1 . Modifique-o conforme necessário.

O motivo para ter $NF+0 > 1 sobre $NF > 1 é fazer uma avaliação numérica pura, considerar um caso em que uma cadeia vazia ou uma cadeia numérica está presente, adicionando 0 para um numérico apropriado para comparação, senão, temos tipos incorretos nos dois lados da comparação.

De Como o awk converte entre strings e números

If, for some reason, you need to force a number to be converted to a string, concatenate that number with the empty string, "". To force a string to be converted to a number, add zero to that string.

    
por 07.01.2018 / 07:45
2

Com o GNU awk :

awk -v min=10 '
  BEGINFILE{n=0}
  /Bicycle/ {n++}
  ENDFILE{if (n >= min) print FILENAME":"n}' /cygdrive/c/Documents/*

Note que ele conta o número de linhas que contém Bicycle , não o número de ocorrências da Bicycle palavra . Para isso, você precisaria:

awk -v min=10 '
  BEGINFILE{n=0}
  {n += gsub(/Bicycle/, "&")}
  ENDFILE{if (n >= min) print FILENAME":"n}' /cygdrive/c/Documents/*

Para pesquisa recursiva:

find /cygdrive/c/Documents -type f -exec awk -v min=10 '
  BEGINFILE{n=0}
  /Bicycle/ {n++}
  ENDFILE{if (n >= min) print FILENAME":"n}' {} +
    
por 07.01.2018 / 08:02
0

Método1

 grep -c   "Bicycle" * |sed -r "s/\s+//g" | awk -F ":"  '{print $1,$2}' | sort -nr -k2| head -1

Método2

Aqui eu consisdered para exibir os arquivos com contagens que tendo contagem superior a 3

grep -c   "Bicycle" * |sed -r "s/\s+//g" | awk -F ":"  '$2 > "3"{print $1,$2}'
    
por 07.01.2018 / 21:46

Tags