Assumirei que seu arquivo é de nova linha, não de retorno de carro separado, porque o comando que você fornece não funcionará com um arquivo \r
separado.
Se o seu arquivo estiver usando \r
em vez de \n
para fins de linha, altere-o para usar \n
executando este:
perl -i -pe 's/\r/\n/g' urls.txt
Se você estiver usando os finais de linha estilo Windows ( \r\n
), use este:
perl -i -pe 's/\r//g' urls.txt
Agora, quando você tiver seu arquivo no formato Unix, se não se importar que seus trabalhos não sejam executados paralelamente , será possível fazer algo assim:
while read url; do
echo "=======================================";
echo "$url"
echo "=======================================";
echo -n "First Hit: Caching: ";
wget --server-response -q -O - $url 2>&1 | grep Caching >/dev/null
if [ $? == 0 ]; then echo HIT; else echo MISS; fi;
echo -n "Second Hit: Caching: ";
wget --server-response -q -O - $url 2>&1 | grep Caching >/dev/null
if [ $? == 0 ]; then echo HIT; else echo MISS; fi; echo "";
done < urls.txt
UPDATE em resposta ao seu comentário:
Se você tem 22.000 URLs, posso realmente entender por que você quer fazer isso em paralelo. Uma coisa que você pode tentar é criar arquivos tmp:
(while read url; do
(
echo "=======================================";
echo "$url"
echo "=======================================";
echo -n "First Hit: Caching: ";
wget --server-response -q -O - $url 2>&1 | grep Caching >/dev/null
if [ $? == 0 ]; then echo HIT; else echo MISS; fi;
echo -n "Second Hit: Caching: ";
wget --server-response -q -O - $url 2>&1 | grep Caching >/dev/null
if [ $? == 0 ]; then echo HIT; else echo MISS; fi;
echo ""; ) > 'mktemp urltmpXXX' 2>/dev/null&
done < urls.txt )
Existem dois subshells lançados lá, o primeiro, (while ... < urls.txt)
é apenas para suprimir as mensagens de conclusão . O segundo ( ( echo "=== ... ) > mktemp urltmpXXX
) está lá para coletar todas as saídas de um determinado URL em um arquivo.
O script acima criará 22.000 arquivos tmp chamados urltmpXXX
, em que XXX
será substituído por tantos caracteres aleatórios. Como os arquivos tmp terão 6 linhas de texto quando todos tiverem terminado, você poderá monitorar (e, opcionalmente, excluir os arquivos) com este comando:
b='awk 'END{print NR}' urls.txt';
while true; do
a='wc -l urltmp* | grep total | awk '{print $1}'';
if [ $a == $((6 * $b)) ]; then cat urltmp* > urls.out; break;
else sleep 1; fi;
done
Agora, o outro problema é que isso iniciará 22000 tarefas de uma só vez. Dependendo do seu sistema, isso pode ou não ser um problema. Uma maneira de contornar isso é split
do arquivo de entrada e, em seguida, executar o loop acima uma vez para cada arquivo.