Problema ao obter saída awk no loop

2

Estou tentando criar um script que verificará uma palavra em um site. Eu tenho alguns para verificar, então estou tentando inseri-los através de outro arquivo.

O arquivo é chamado de "testurls". No arquivo, listo a palavra-chave e, em seguida, o URL. Eles são separados por um ponto e vírgula.

Example Domains;www.example.com
Google;www.google.com

Aqui está o script:

#!/bin/bash
clear

# Call list of keywords and urls
DATA='cat testurls'

for keyurl in $DATA
do
    keyword='awk -F ";" '{print $1}' $keyurl'
    url='awk -F ";" '{print $2}' $keyurl'
    curl -silent $url | grep '$keyword' > /dev/null
 if [ $? != 0 ]; then
    # Fail
        echo "Did not find $keyword on $url"
    else
    # Pass
        echo $url "Okay"
fi
done

A saída é:

awk: cannot open Example (No such file or directory)
awk: cannot open Example (No such file or directory)
curl: no URL specified!
curl: try 'curl --help' or 'curl --manual' for more information
Did not find  on
awk: cannot open Domains;www.example.com (No such file or directory)
awk: cannot open Domains;www.example.com (No such file or directory)
curl: no URL specified!
curl: try 'curl --help' or 'curl --manual' for more information
Did not find  on
awk: cannot open Google;www.google.com (No such file or directory)
awk: cannot open Google;www.google.com (No such file or directory)
curl: no URL specified!
curl: try 'curl --help' or 'curl --manual' for more information
Did not find  on

Eu tenho cortado isso há muito tempo. Qualquer ajuda é muito bem vinda.

    
por jetgerbil 24.11.2011 / 22:52

3 respostas

6

Existem vários problemas com o seu script. Eu listei os que encontrei, mas não testei, pode haver outros.

for keyurl in $DATA; do … divide $DATA em cada espaço em branco, não em cada nova linha. Portanto, na primeira iteração, $DATA será Example ; então Domains;www.example.com e assim por diante. Além disso, cada valor é submetido à expansão de curinga, portanto, se houver um * em uma palavra-chave, você poderá ver resultados funky dependendo dos arquivos presentes no diretório atual.

Você é tring para processar dados separados por nova linha . Uma maneira simples é

while read -r keyurl; do
  …
done <testurls

Isso tira o recuo de cada linha, o que provavelmente não é uma coisa ruim aqui. (Use IFS= read -r keyurl se quiser que keyurl contenha cada linha exatamente).

Suas chamadas para awk não estão funcionando porque você está passando $keyurl como um nome de arquivo. Você precisa passá-lo como entrada. Enquanto você está nisso, sempre use aspas duplas em torno de substituições de variáveis (caso contrário, o shell executa algumas expansões em seu valor). Também recomendo usar $(…) em vez de '…' ; eles são os mesmos, exceto que '…' é difícil de usar quando você quer citar coisas dentro, enquanto a sintaxe de $(…) é intuitiva.

keyword='echo "$keyurl" | awk -F ";" '{print $1}''
url='echo "$keyurl" | awk -F ";" '{print $2}''

Existe uma maneira melhor de dividir uma variável no primeiro ponto-e-vírgula: use as construções internas do shell para remover um prefixo ou sufixo de uma string.

keyword=${keyurl%%;*} url=${keyurl#*;}

Mas como seus dados vêm do read integrado e o separador é um único caractere, você pode aproveitar o recurso IFS e dividir sua entrada diretamente à medida que você o lê.

while IFS=';' read -r keyword url; do …

Chegando às suas chamadas curl e grep, observe que você está procurando pelo texto literal $keyword , já que usou aspas simples. Use aspas duplas; Observe que a palavra-chave será interpretada como uma expressão regular básica . Se você quiser que a palavra-chave seja interpretada como uma string literal, passe a opção -F para grep . Você também deve colocar -e antes do padrão, caso a palavra-chave comece com o caractere - (caso contrário, a palavra-chave será interpretada como uma opção para o grep). Finalmente, no tópico grep, sua opção -q é equivalente a >/dev/null . Lembre-se também das aspas duplas em torno de $url .

curl -silent "$url" | grep -Fqe "$keyword"

Você pode encurtar a parte if [ $? != 0 ]; then colocando o comando diretamente aqui.

if curl -silent "$url" | grep -Fqe "$keyword"; then

Em resumo,

while IFS=';' read -r keyword url; do
  if curl -silent "$url" | grep -Fqe "$keyword"; then
    echo "Did not find $keyword on $url"
  else
    echo $url "Okay"
  fi
done
    
por 25.11.2011 / 00:38
1

o awk está considerando o valor de $ keyurl como arquivo de dados a ser processado. Você precisa alimentar valor de $ keyurl para awk como

keyword='echo $keyurl | awk -F ";" '{print $1}''

Isso resolverá um dos seus muitos problemas.

    
por 24.11.2011 / 23:10
0

Se o formato de testurls for consistente, você poderia usar uma abordagem mais simples:

#!/bin/bash
while read -r line; do
    keyword="${line%;*}"
    url="${line#*;}"
    curl -silent "$url" | grep "$keyword" >/dev/null
    [ $? = 0 ] && echo "${keyword} found" || echo "Fail..."
done < testurls
    
por 25.11.2011 / 00:18