Tengo una larga lista de URLs. Contenidos dentro de cada una de estas páginas web, hay enlaces que necesito extraer. La acción de Automator Obtener URL de enlace de páginas web es una acción muy útil para esta tarea. Desafortunadamente, el propio Automator no maneja muy bien las cargas de trabajo pesadas y muy a menudo se bloquea o se cuelga indefinidamente. ¿Cómo puedo hacer esto con Bash a través de la aplicación Terminal de Mac OS X?
Editar: este es el script actual tal como está ahora.
#!/bin/bash
echo "Enter up to 3 words"
read -p "" v1 v2 v3
web="$HOME/web.txt"
tmp="$HOME/tmp.txt"
err="$HOME/err.txt"
fin="$HOME/fin.txt"
arc="$HOME/arc.txt"
n="$(awk 'END {print NR}' "$web")"
echo "Processing $n URLs..."
grep 'http' "$web" | \
while read -r url; do
lynx -nonumbers -hiddenlinks=merge -dump -listonly "$url" 2>>"$err" | awk '!a[$0]++' >> "$tmp"
sleep 1
n=$((n-1))
[[ $n -gt 0 ]] && echo "$n URLs left to process..." || echo "Processing Completed!"
done
grep -e "$v1" -e "$v2" -e "$v3" "$tmp" | sort -u | cat > "$fin"
cat "$fin" >> "$arc"
for r in "Results This Session"; do echo "$(cat "$fin" | wc -l)" "$r"; done
for a in "URL's Archived"; do echo "$(cat "$arc" | wc -l)" "$a"; done
Agregué read -p
al principio del script. ¿Existen limitaciones en el número de variables que se pueden usar de esta manera? He utilizado con éxito hasta 9 en las pruebas. ¿Y hay una manera más práctica de escribir esto? Intenté read -p "" {v1..v9}
que no funcionó. Agregué un par de bucles for
al final para indicar cuántos datos se procesaron.
Problemas actuales
-
a veces me sale un error
sort: string comparison failed: Illegal byte sequence sort: Set LC_ALL='C' to work around the problem.
sin embargo, cuando se agrega
LS_ALL=C
a la secuencia de comandos no parece que esto sea correcto.