Curl url txt, mas grep cada url separadamente do arquivo único

2

Eu tenho um arquivo de texto com muitos URL's nele. Estou usando

curl -K "$urls" > $output

para cuspir a saída no meu arquivo de saída. Agora, para a saída de cada url separada, há um termo, digamos, "hipoteca", abaixo do qual não desejo mais nenhuma informação. Agora eu sei que posso usar

sed '/mortgage/q'

para remover todas as informações abaixo do termo "hipoteca", mas se eu usá-lo dentro do meu script, assim

curl -K "$urls" | sed '/mortgage/q' > $output

ele remove tudo da saída inteira abaixo da primeira instância de "hipoteca" da saída do primeiro url em $ urls, mas isso limpa todas as informações dos outros URLs (incluindo o material antes de sua própria instância do URL). palavra "hipoteca") devido ao fato de que ele está trabalhando em toda a saída, e não para cada URL.

Como posso especificar o sed '/mortgage/q' para atuar separadamente na saída de cada URL no arquivo de URL para que ele não afete a saída globalmente?

Meu arquivo de URL é bem simples, no formato (isso é apenas um exemplo):

URL = http://www.bbc.co.uk/sport/rugby-union/34914911

URL = http://stackoverflow.com/questions/9084453/simple-script-to-check-if-a-webpage-has-been-updated

e assim por diante .....

Eu concebi uma maneira hipotética de conseguir isso, mas não tenho certeza do código - existe alguma maneira de eu adaptar o comando curl -K "$urls" | sed '/mortgage/q' > $output para que o comando retorne após cada URL subseqüente no arquivo $url , ou seja, que o comando curl inicialmente apenas recupera o primeiro url no arquivo, executa o comando sed nesse material de url, anexa a $output , faz um loop de volta para o segundo url no arquivo, executa o comando sed, anexa a $output e assim por diante .... Isso significaria que o material necessário de cada URL foi incluído no arquivo de saída, mas o material abaixo de 'hipoteca' em cada URL não foi. Eu só não sei como conseguir isso com código. Alguma idéia?

    
por neilH 25.11.2015 / 11:33

2 respostas

3

Isso deve ser feito em duas linhas:

sed -n 's/\s*URL\s*=\s*\(.*\)//p' /tmp/curl.conf|xargs -I {} curl -O "{}"
sed -n 's/\s*URL\s*=\s*\(.*\)//p' /tmp/curl.conf|xargs -I {} basename "{}"|xargs -I {} sed '/mortgage/q' "{}"

O primeiro comando sed em cada linha extrai as URLs do seu arquivo urls (/tmp/curl.conf no exemplo). Na primeira linha, usamos a opção -O de curl para salvar a saída de cada página em um arquivo que tenha o nome da página. Na segunda linha, reexaminamos cada um desses arquivos e mostramos apenas o texto em que você está interessado. É claro que, se a palavra 'hipoteca' não ocorrer em um arquivo, todo o arquivo será produzido.

Isso deixará você com um arquivo temporário para cada URL no diretório atual.

EDITAR:

aqui está um script curto que evita os arquivos que sobraram, envia o resultado para a saída padrão, você pode redirecioná-lo da forma que desejar:

#!/bin/bash
TMPF=$(mktemp)
# sed command extracts URLs line by line
sed -n 's/\s*URL\s*=\s*\(.*\)//p' /tmp/curl.conf >$TMPF
while read URL; do
    # retrieve each web page and delete any text after 'mortgage' (substitute whatever test you like)
    curl "$URL" 2>/dev/null | sed '/mortgage/q'
done <"$TMPF"
rm "$TMPF"
    
por 25.11.2015 / 13:02
0

Esse truque geral funciona mesmo se o arquivo de configuração de curvas contiver opções diversas, como user-agent, referer, etc.

Primeiro, assuma o seu arquivo de configuração chamado curl_config e use awk '/^[Uu][Rr][Ll]/{print;print "output = dummy/"++k;next}1' curl_config > curl_config2 para criar um novo arquivo de configuração de curl que acrescente incrementalmente diferentes nomes de arquivo de saída em cada url / URL:

Exemplo:

[xiaobai@xiaobai curl]$ cat curl_config
URL = "www.google.com"
user-agent = "holeagent/5.0"

url = "m12345.google.com"
user-agent = "holeagent/5.0"

URL = "googlevideo.com"
user-agent = "holeagent/5.0"
[xiaobai@xiaobai curl]$ awk '/^[Uu][Rr][Ll]/{print;print "output = dummy/"++k;next}1' curl_config  > curl_config2 
[xiaobai@xiaobai curl]$ cat curl_config2
URL = "www.google.com"
output = dummy/1
user-agent = "holeagent/5.0"

url = "m12345.google.com"
output = dummy/2
user-agent = "holeagent/5.0"

URL = "googlevideo.com"
output = dummy/3
user-agent = "holeagent/5.0"
[xiaobai@xiaobai curl]$ 

Em seguida, mkdir dummy para criar um diretório para armazenar esses arquivos temporários. Crie inotifywait session (Substitua o sed '/ google / q' pelo seu sed '/ mortgage / q'):

[xiaobai@xiaobai curl]$ rm -r dummy; mkdir dummy;
[xiaobai@xiaobai curl]$ rm final 
[xiaobai@xiaobai curl]$ inotifywait -m dummy -e close_write | while read path action file; do echo "[$file]">> final ; sed '/google/q' "$path$file" >> final; echo "$path$file"; rm "$path$file"; done;
Setting up watches.
Watches established.

Abra outro arquivo bash / terminal, rm final , se existir, e execute o curl com o arquivo curl_config2 criado no primeiro passo acima:

[xiaobai@xiaobai curl]$ curl -vLK curl_config2
...processing

Agora, dê uma olhada na sessão inotifywait, ele irá imprimir o último arquivo por perto, sed-lo e removê-lo imediatamente, uma vez feito:

[xiaobai@xiaobai curl]$ inotifywait -m dummy -e close_write | while read path action file; do echo "[$file]">> final ; sed '/google/q' "$path$file" >> final; echo "$path$file"; rm "$path$file"; done;
Setting up watches.
Watches established.
dummy/1
dummy/3

Por fim, você pode observar sua saída denominada final . O separador [1 e 3] é gerado a partir de echo "[$file]">> final acima:

A razão de remover o arquivo imediatamente é porque eu suponho que seu arquivo de saída é grande e muitos URLs precisam continuar, então ele pode economizar espaço em disco para removê-lo imediatamente.

    
por 25.11.2015 / 14:41