Usando o wget e o grep para baixar páginas HTML e filtrar por palavras-chave

2
KEYWORDS=("dolphins" "fish" "dogs" "cats" "iguanas")
IFS=$'\n'
find . -type f -size +1c ! -exec grep -qF "${KEYWORDS[*]}" {} \; -exec truncate -s 0 -f {} \;

Se um arquivo tiver mais de 1 byte, pesquise palavras-chave. Se a palavra-chave não for encontrada, truncá-la para 0 bytes. Eu recebo o seguinte erro:

truncate: invalid option -- 'f'
Try 'truncate --help' for more information.
    
por Guest in need of help 13.01.2014 / 18:16

4 respostas

2

KEYWORDS=("dolphins" "fish" "dogs" "cats" "iguanas")
IFS=$'\n'
find . -type f ! -exec grep -qF "${KEYWORDS[*]}" {} \; -exec rm -f {} \;

Excluiria os arquivos que não possuem nenhuma das palavras-chave.

    
por 13.01.2014 / 21:49
2

Ao usar expressões regulares estendidas ou Perl, grep pode ter vários padrões de pesquisa separados por um canal ( | ):

   -E, --extended-regexp
          Interpret  PATTERN  as  an extended regular expression (ERE, see
          below).  (-E is specified by POSIX.)

   -P, --perl-regexp
          Interpret  PATTERN  as  a  Perl  regular  expression  (PCRE, see
          below).  This is highly experimental and grep  -P  may  warn  of
          unimplemented features.

Isso significa que você não precisa declarar um array para seus kewords, basta combiná-los em uma única string, separados por | . Isso facilita muito seu script:

#!/usr/bin/env bash

wget --no-clobber -r -E -e robots=off -U mozilla -R gif,jpeg,tif,jpg,pdf,bmp,png,css,js http://www.url.com

KEYWORDS='dolphins|fish|dogs|cats|iguanas'

for file in **; do
    if [[ -r "$file" ]] && [[ -f file ]] ! grep -wqP "$KEYWORDS" "$file"; then
          rm -f "$file" 
    fi
done
    
por 13.01.2014 / 19:29
0

Para encontrar arquivos que não contenham um padrão específico, você pode usar:

if ! grep -q $pattern "$file"; then
    # The file does not have a match
    do_stuff_to "$file"
else
    # There is a match
    do_something_else_to "$file"
fi

Então, para usar suas palavras-chave de exemplo, depois do seu wget , você pode usar:

declare -a KEYWORDS
KEYWORDS=("dolphins" "fish" "dogs" "cats" "iguanas")

for keyword in ${KEYWORDS[@]}; do
    for file in **; do
    if [[ -r "$file" ]] && ! grep -q $keyword "$file"; do
        rm -f "$file"
    fi
done
    
por 13.01.2014 / 18:22
0

Você está ansioso para excluir um arquivo que não contém sequer uma única palavra-chave? (Em outras palavras, reter os arquivos que contêm pelo menos uma palavra-chave?) A seguir apresenta uma solução compacta usando o GNU grep :

rm $(find . -type f -exec grep -LwE 'keyword1|keyword2|keyword3' {} +)

Acima, find . -type f -exec grep -LwE 'keyword1|keyword2|keyword3' {} + lista o nome de todo o arquivo que não contém nenhuma palavra-chave. Aqui, três argumentos são usados com grep :

  1. w indica que uma palavra inteira deve ser correspondida (por exemplo, grep -w get file_name indica que a palavra inteira "get" deve ser correspondida no arquivo e não dizer "esquecer").
  2. E informa grep para corresponder a vários padrões. Nesse caso, suas palavras-chave são os padrões.
  3. L imprime os nomes dos arquivos que não correspondem a nenhum padrão. Para citar as man pages:

-L, --files-without-match Suppress normal output; instead print the name of each input file from which no output would normally have been printed. The scanning will stop on the first match.

Portanto, quando find retornar uma lista de nomes de arquivos, você poderá excluí-los usando rm .

Como você sabe, rm excluirá os arquivos. Portanto, tenha cuidado ao executar o comando acima. No começo, você pode simplesmente executar o comando find e verificar manualmente se ele funciona conforme sua necessidade.

    
por 13.01.2014 / 19:28

Tags