Como encontrar o número total de ocorrências de texto e arquivos com o comando find

6

Estou tentando executar o comando find para localizar o número total de ocorrências de uma sequência de texto específica e também o número de arquivos com essa sequência de texto.

O que eu tenho agora é esse comando.

find . -name "*.txt" | xargs grep -i "abc"

Isso informa todos os arquivos "* .txt" que contêm o texto "abc". Eu quero um ou dois comandos de busca para obter

  1. Número total de vezes que abc aparece
  2. Número total de arquivos com abc.
por Nomad 04.05.2012 / 04:35

4 respostas

5

Para a pergunta 1, você pode fazer isso:

find . -name "*.txt" | xargs grep -i "abc" | wc -l

Isso conta o número total de correspondências de abc em todos os arquivos de texto.

E para a pergunta 2, eu criei:

find . -name "*.txt" -exec grep -i "abc" {} + | cut -d: -f1 | sort | uniq | wc -l

Isso obtém apenas os nomes de arquivos exclusivos da lista de correspondências e os conta (o tipo provavelmente não é necessário).

Como apontado por miracle173, grep vem com um sinalizador "uma correspondência por arquivo" para que o comando possa ser reduzido para:

find . -name "*.txt" -exec grep -il "abc" {} + | wc -l

    
por 04.05.2012 / 06:20
3

A opção -c do grep é o que você precisa aqui

find . -name \*txt | xargs grep -c -i "abc" | {
    total=0
    count=0 
    while IFS=: read name num; do 
        ((num > 0)) && ((count+=1))
        ((total+=num))
    done
    echo total=$total 
    echo count=$count
}

As chaves para agrupar os comandos em torno do loop while são necessárias para manter as variáveis em um escopo para essa sub-camada.

    
por 04.05.2012 / 18:40
3
$ grep -R --include='*.txt' -c -i abc . | awk -F: ' 
           BEGIN {
                    totalCount=0;noOfFiles=0;
                 } 
                 { totalCount=totalCount+$2; 
                   if ( $2 > 0 ) 
                   {
                       noOfFiles+=1;
                   } 
                 } 
            END {
             print "Total number of times abc appears:"totalCount; 
             print "Total number of files which has abc in it:"noOfFiles
            } '

(OR)

A saída ls não deve ser usada para analisada por outros programas. Veja o comentário abaixo.

$  ls -Rltr | awk '/.txt/{print $NF }' | xargs grep -c -i "abc" | awk -F: ' 
       BEGIN {
                totalCount=0;noOfFiles=0;
             } 
             { totalCount=totalCount+$2; 
               if ( $2 > 0 ) 
               {
                   noOfFiles+=1;
               } 
             } 
        END {
         print "Total number of times abc appears:"totalCount; 
         print "Total number of files which has abc in it:"noOfFiles
        } '


Result:
Total number of times abc appears:0
Total number of files which has abc in it:0
    
por 04.05.2012 / 20:09
1

Número de abc contidos nos arquivos:

Para contar o número de todos os "abc" nos arquivos .txt, use grep -c e encontre e - excepcionalmente - cat:

find . -name "*.txt" -exec cat {} + | grep -ic abc

O grep -c fará a contagem total para você - algo que eu não encontrei na resposta do SigueSigueBen, que contém chamadas não justificadas para xargs , imho. As outras 2 respostas para onde anseio por mim. Eu não os estudei e não escreverei essas coisas sozinho.

Número de arquivos contendo abc:

find . -name "*.txt" -exec grep -iq abc {} ";" -printf "1" | wc -c 

Isso não irá falhar com nomes de arquivos (que raramente, eu admito) contendo novas linhas em seus nomes (o que é perfeitamente legal).

    
por 06.05.2012 / 00:39