Perguntas sobre find e grep

0

Eu estava fazendo um pequeno script para encontrar e contar todas as "" aparências em vários arquivos e subdiretórios, então eu preciso imprimir o endereço do arquivo e o número de "as" aparências. Mas não sei como terminar.

    find . -name "*.txt" -type f -printf "%p\t" -exec grep -c "the" {}\; 

ex.sh o nome do programa

txt uma extensão de arquivo

a palavra para encontrar as aparências

  • A saída correta deve ser:

    ./ex.sh txt the
    
    ./etext00/00ws110.txt 42764
    ./etext00/1cahe10.txt 26692
    ./etext00/1vkip11.txt 21895
    ./etext00/2cahe10.txt 24604
    ./etext00/2yb4m10.txt 15476
    ./etext00/8rbaa10.txt 3131
    
  • O que eu recebo:

    ./etext00/00ws110.txt   35388
    ./etext00/1cahe10.txt   17905
    ./etext00/1vkip11.txt   14617
    ./etext00/2cahe10.txt   16971
    ./etext00/2yb4m10.txt   9938
    ./etext00/8rbaa10.txt   1839
    

    Suponho que é o número de linhas que contém a aparência "the", mas em algumas linhas pode haver mais de 1 "the".

por Arnau Martínez 22.03.2018 / 12:42

2 respostas

0

Use grep -o the e conte o número de linhas que isso gera:

find . -name "*.txt" -type f -printf "%p\t" \
    -exec sh -c 'grep -o "the" "$0" | wc -l' {} \; 

grep -o retorna cada correspondência em cada linha, em linhas separadas (uma correspondência é retornada por linha de saída).

Você também pode usar -wi com grep para incluir The (insensibilidade a maiúsculas e minúsculas) e excluir correspondências como the em theory (correspondência completa de palavras).

    
por 22.03.2018 / 12:47
0

Como você já está usando as extensões GNU ( -printf ), com o GNU awk , você pode fazer:

find . -name '*.txt' -size +2c -readable -type f -exec gawk -v RS=the '
   ENDFILE {print FILENAME "\t" (FNR - ($0 != ""))}' {} +

Isso é usar txt como o delimitador de registro e informar o número de registros após o processamento de cada arquivo. Mas não conte o registro extra que pode (e geralmente ocorrerá) após a última ocorrência de txt .

    
por 22.03.2018 / 12:57